一:基本概念
1.反射:动态创建对象,动态调用方法、访问并修改指定对象的成员变量值。
java中的类实际上也是实例,它们都是java.lang.Class的实例哦!
2.类加载或类初始化: 加载 连接 初始化 三个步骤哦!
类加载器:将.class文件加载到内存中去。并生成对应的java.lang.Class对象。
加载:将类的class文件读入内存,并创建其对应的Class对象。 通过类加载器实现的哦!
类加载机制:缓存机制,保证所有加载过的Class都会被缓存,所以修改java文件后必须重启JVM。
连接:将类的二进制数据合并到JRE中(验证、准备、解析)。
验证:
准备:为类变量分配内存,设置初始值。
解析:将类的二进制数据中的符号引用替换成直接引用。
初始化:指定初始值。 先初始化其直接父类!(向上递归哦)
3.java对象:编译时类型和运行时类型
编译时和运行时?
java机制:每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该对象就可以访问到JVM中的这个类。
获取Class对象的三种方式:
1.Class.forName(String clazzName)
2.调用类的class属性 Person.class
3.调用某个对象的getClass()方法
4.可以访问到的资源:构造器、方法、成员变量、Annotation(注解)、内部类、该类所实现的接口、该类的修饰符、包名。
5.反射创建对象
1.获取Class对象后,使用Class对象的newInstance()方法来创建该Class对象对应类的实例。
spring就是如此实现的哦!
a:使用配置文件配置对象。
b:程序根据配置文件来创建对象
2.使用Class对象获取指定的Constructor对象(getConstructor()来获取),再调用Constructor对象的newInstance()方法来创建Class对象对应类的实例。
二:难点(动态代理)
三:反射和泛型
1.通过在反射中使用泛型,可以避免使用反射生成的对象需要强制类型转换。
Class类的泛型:String.class 的类型是 Class<String>; 如果Class对应的类暂时未知,则使用Class<?>。
对比:和集合的泛型很像哦!
2. 注解.class ?
接口.class ?
四:总结
1.什么事反射?
http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
http://blog.csdn.net/liujiahan629629/article/details/18013523
2.什么事动态代理?
3.指针?
4.类加载器:将.class文件加载到内存中!