一、反射
- 何为反射机制:在运行状态中,对于任意一个类,都能够获取这个类的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用的方法的功能称之为反射机制。
- 反射机制能做什么:
- 在运行时判断任意一个对象所属的类。
- 在运行时构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法。
- 在运行时调用任意一个对象的方法。
- 生成动态代理。
二、JAVA类加载
每个Java程序执行前都必须经过编译、加载、连接、和初始化这几个阶段
加载:查找并加载类的二进制数据
连接:1.验证:确保被加载的类的正确性
2.准备:为类的静态变量分配内存,并将其初始化为默认值
3.解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值
i、加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在
运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构。
即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,
无论这个类创建了多少个对象,他的Class对象是唯一的!!!!。
而 加载并获取该Class对象可以通过三种途径:
Class.forName(类的全路径)、实例对象.class(属性)、实例对象getClass()。
在连接和初始化阶段,其实静态变量经过了两次赋值:
第一次是静态变量类型的默认值;
第二次是我们真正赋给静态变量的值。
三、使用
- Integer数组中加入String 类型的字符串。
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { List<Integer> list = new ArrayList<>(); Method method = list.getClass().getMethod("add", Object.class); method.invoke(list, "java 反射"); System.out.println(list.get(0)); }
四、好处
使用反射的好处:
1.创建的对象不用new
2.可以动态创建对象(把要创建的对象的类型写在配置文件中,每次程序启动读取配置文件,再自动创建对象)
五、new 和 newInstance区别
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。