1、获得一个类的类对象有哪些方式?
阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的
获取class对象的三种方式:对象获取、类名获取、class类的静态方法获取字符串需要是包名.类名(全类名)
2、如何通过反射创建对象?
有两种方式:
1.使用Class对象的newInstance()方法来创建该Class对象对应类的实例,这种方式要求该Class对象的对应类有默认构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。
2.先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例
第一种方法比较常见,在spring这些框架中,会根据配置文件自动创建类的实例并注入到依赖此类的类中。这时候用的最多的就是默认构造器。像是在spring的配置文件中,我们提供的是某个类的全类名,这种情况要创建类的实例,就必须使用反射了。
3、如何通过反射获取和设置对象私有字段的值?
4、如何通过反射调用对象的方法?
5、类加载器加载类
当程序要使用某个类时,虚拟机就会检查这个类在不在内存中,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来将类加载到内存中。
加载
虚拟机启动类加载器将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象
【这个时候就会将class文件放入到内存中的方法区,这个时候加载器还会干一件事就是为这个类创建一个class对象,创建的是一个编译后的class文件的一个对象,该对象会放到堆内存中。这个对象只能由类加载器创建,不能new】
连接
验证【验证,也就是检查类的内部结构】 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用【方法中有运算,a=1,在这里直接就是1,可以节约资源。也就是说a=1这种符号引用直接替换成1】
初始化 【前边两步:加载和连接是类加载器做的,初始化使我们做的】
就是我们以前讲过的初始化步骤【就是给类创建对象,我们自己创建】
类加载时机,就是什么时候会加载这个类,放到内存中
(1)创建main方法,运行这个类的时候
(2)第二种情况就是使用类中的东西了,比如创建该类的实例、调用这个类的静态成员
(3)初始化某个类的子类(创建子类对象,父类会被先加载)
(4)使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
(5)直接使用java.exe命令来运行某个主类
6、类加载器
作用:
负责将.class文件加载到内在中,并为之生成对应的Class对象。
虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行
类加载器的组成
(1)Bootstrap ClassLoader 根类加载器
也被称为引导类加载器,负责Java核心类库的加载
比如System类,String类等。在JDK中JRE的lib目录下rt.jar文件中
(2)Extension ClassLoader 扩展类加载器
负责JRE的扩展目录中jar包的加载。
在JDK中JRE的lib目录下ext目录(文件夹)
(3)System ClassLoader 系统类加载器
负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。【加载我们自己写的类,以及我们添加的第三方的工具类】
7、反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。
反射的作用
我们已经做好一个程序,现在需要进行功能扩充等操作,在不修改源代码的情况下,可以利用反射技术来实现。也就是在程序运行的时候我们可以获取具有新功能类的class文件对象,然后可以调用这个对象中的方法和属性。
一个类的成员有哪些?
方法、构造器、变量
获取class类对象后
解剖类
调用成员
8、通过反射获取构造方法并使用
在反射机制中,把类中的成员(构造方法、成员方法、成员变量)都封装成了对应的类进行表示。其中,构造方法使用类Constructor表示。
public Constructor<?>[] getConstructors() 获取所有的public 修饰(公共)的构造方法
public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(包含私有的)
网友评论