1.反射
反射被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API
取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
类加载是指:将类的class文件读入内存,并在堆内存中的方法区对应创建一个java.lang.Class对象,一个类只有一个Class对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像是一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为反射。
类加载的几种来源
-
从本地文件系统加载class文件,也就是本地代码
-
从jar包中加载class文件,例如JDBC的数据库驱动包
-
通过网络加载class文件,例如GitHub上的class文件
-
把一个java源文件动态编译,并执行加载
类的加载过程:类加载器子系统
2.反射机制提供的功能
-
在运行时判断任意一个对象所属的类
-
在运行时构造任意一个类的对象
-
在运行时判断任意一个类所具有的成员变量和方法
-
在运行时获取泛型信息
-
在运行时调用任意一个对象的成员变量和成员方法
-
在运行时处理注解
-
生成动态代理
3.Class类
反射的原理总结:
-
反射类及反射方法的获取,都是通过从列表中搜寻查找匹配的方法,所以查找性能会随着类的大小、方法的多少而变化
-
每个类都会有一个与之对应的Class实例,从而每个类都可以获取method反射方法,并作用到其他实例上
-
反射也是考虑了线程安全的
-
反射使用软引用relectionData缓存class信息,避免每次重新在jvm获取带来的开销
-
反射调用多次生成新代理Accessor,而通过字节码存储,则考虑了卸载的功能,所以会使用独立的类加载器
-
当找到需要的方法,都会copy一份出来,而不是使用原来的实例,从而保证数据隔离
-
调度反射方法,始终都是由jvm执行invoke0()