【JAVA SE基础篇】67.反射机制介绍
1.动态语言
程序在运行的时候,可以改变程序结构或变量类型。
典型的语言:Python,ruby,javascript等
例:javascript代码:
function test(){
var s="var a=3;var b=5;alert(a+b);":
eval(s);
}
c,c++,java不是动态语言,java是“准动态语言”。
但是java有一定的动态性,我们可以利用反射机制,字节码的操作获得类似动态语言的特性
java的动态性让编程更加灵活
2.反射机制介绍(reflection)
指的是可以运行时加载,探知,使用编译期间完全未知的类
程序在运行状态中,可以动态加载一个只有名称的类
对于任意一个已加载的类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用他的任意方法和属性
Class c =Class.forName(“”);
加载完类之后,在堆内存中,产生一个Class类型的对象(一个类只有一个Class对象)
这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。
这个对象就像一面镜子,透过镜子看到类的结构,称位反射。
例:
注:java.lang.Class类十分特殊,用来表示java中的类型本身
Class类的对象包含了某个加载类的结构。一个被加载的类对应一个Class对象
当一个Class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM便自动产生一个Class对象
Class类是反射的根本,任何想动态加载、运行的类,唯有先获得相应的Class对象
3.获取Class类对象的方法
1.getClass()
2.Class.forName()
3..class语法
例;
4.反射机制的性能
setAccessible提高反射性能
用法:
1.启用和禁用访问安全检查的开关,值为true则指示反射的对象在使用时应该取消java语言访问检查
值为false则指示反射的对象应该实施java语言访问检查。并不是为true就能访问,为false就不能访问
2.禁止安全检查,可以提高反射的运行速度
5.反射机制的常见作用
1.动态加载类、动态获取类的信息(属性、方法、构造器)
2.动态构造对象
3.动态调用类和对象的任意方法、构造器
4.动态调用和处理属性
5.获取泛型信息
java中采用泛型擦除机制来引入泛型。java中泛型只给编译器看,确保数据安全型和免去强制类型转换的麻烦
一旦编译完成,所有泛型有关的类型全部擦除,而反射操作的是加载好的类,看不泛型。
为了通过反射操作此类型以迎合实际开发需求,java新增了ParameterizedType,GenericArrayType
TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的的类型但是又和原始类型齐名的类型
ParameterizedType:表示一种参数化的类型,比如Collection<String>
GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
TypeVariable:是各种类型变量的公共父接口
WildcardType:代表一种通配符类型表达式
6.处理注解