反射机制是 Java 的动态性之一
动态语言:在程序运行时,可以改变程序的结构或变量的类型。
举例:JavaScript语言
运行结果;
Java 代码运行:
典型的动态语言”Python、ruby、JavaScripC,C++,Java 不是动态语言,但具有一定的动态性,可以称为”准动态语言”,具备类似动态语言的特性。
传一块代码来动态的执行,动态的处理,Java 也能做,可以利用反射来实现类似的功能。
Java的动态性让编程变得更加的灵活,功能就更加的强大。
反射机制
程序在运行的过程中加载一些“只知道相关名字”的类,以下代码,在程序运行时加载 User 类。
Class c=Class.forName("com.bjsxt.reflect.User");
一个类被加载后,JVM 会创建一个对应类的 Class 对象,类的整个结构信息会被放到 Class 对象中。
这个 Class 对象就像镜子一样,通过这面镜子,可以得到对应类的全部信息。
反射机制的常见作用
1) 动态的加载类、动态的获取类的信息(属性,方法,构造器)
2) 动态构造对象
3) 动态调用类和对象的任意方法、构造器
4) 动态调用和处理属性
5) 获取泛型信息
6) 处理注解
获取 Class 对象的方式
1) 通过字节码文件 类名.class
Class clazz = User.class;
2) 对象的 getClass()方法
User user = new User();
Class clazz = user.getClass();
3) Class 类的静态方法 forName(….)
Class clazz = Class.forName("com.sxt.reflect.User");
代码演示
提高反射效率
反射机制对程序的运行在性能上有一定的影响,速度慢
如何提高反射的性能
1) 通过 setAccessible 提高性能
a) setAccessible 启用和禁用访问安全检查的开关,值为true 则指示反射的对象在使用时应该取消 Java 语言访问检查,值为 false 则指示反射的对象不实施 Java 语言访问检查,并不是为 true 就能访问为 false 就不能访问
b) 禁止安全检查,可以提高反射的运行速度
反射操作泛型
泛型
Java 中的泛型仅仅是给编译器 javac 使用的,确保数据的安全性和免去强制类型转换的麻烦,但是一旦编译完成,所
有与泛型有关的类型全部擦除。使用泛型直接读取泛型,是读取不到的,因为反射是操作加载以后的类的。
Java 新增的数据类型
为了通过反射操作这些类型以迎合实际开发的需要
1) ParameterizedType: 表 示 一 种 参 数 化 的 类 型 ,比 如Collection<String>,可以获取 String 信息
2) GenericArrayType:泛型数组类型
3) TypeVariable:各种类型变量的公共父接口
4) WildcardType:代表一种通配符类型表达式,比如? extends Number,? super Integer(Wildcard 是一个单词,就是通配符)
注解的作用
1) 不是程序本身,可以对程序作出解释。(这一点跟注释没什么区别)
2) 可以被其他程序(比如:编译器等)读取。(注解信息处理流程,是注解和注释的重大区别,如果没有注解信息处理流程,则注解毫无意义)
注解的格式
1) 注解是以”@注释名”在代码中存在,还可以添加一些参数值,例如@SuppressWarnings(value=”unchecked”)。
注解在哪里使用
1) 可以附加在 package,class,method,field 等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素的访问。
内置的注解
1) @Override :标识方法是重写的方法
2) @Deprecated :标识的方法不建议使用
3) @SuppressWarnings:用来抑制编译时的警告信息
@SuppressWarinings 需要提供参数才能正常使用,这些参数都是已经定义好的,我们只需要选择就可以了。