数据结构系列16——反射
目录
1. 定义
2. 反射相关的类
3. Class类
4. Class类中的相关方法
5. Field类中的相关方法
6. 获得类中注解相关的方法
7.获得类中构造器相关的方法
8. 获得类中方法相关的方法
9. 反射示例
9.1 第一步:拿到当前反射类的Class
9.2 第二步:使用反射
10. 反射的优点与缺点
1. 定义
java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够直到这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性,我们也随之就可以进行修改部分类型的信息;这种动态获取信息以及动态调用对象方法的功能成为java语言的反射机制。
2. 反射相关的类
3. Class类
java文件被编译后,生成了.class文件,JVM此时就要解读.class文件,被编译后的java文件.class也被JVM解析为一个对象,这个对象就是java.lang.class。这样当程序运行的时候,每个java文件最终就变成一个Class类对象的一个实例。通过反射机制应用到这个实例,就可以去获得甚至去添加改变这个类的动作和属性,使得这个类变成一个动态的类。
4. Class类中的相关方法
(重要)常用获得类相关的方法
方法 | 用途 |
getClassLoader() | 获得类的加载器 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有的) |
forName(String className) | 根据类名返回类的对象 |
newInstance() | 创建类的实例 |
getName() | 获得类的完整路径名字 |
5. Field类中的相关方法
方法 | 用途 |
getField(String name) | 获得某个公有的属性对象 |
getFields() | 获得所有公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
6. 获得类中注解相关的方法
7.获得类中构造器相关的方法
8. 获得类中方法相关的方法
方法 | 用途 |
getMethod(String name, Class...<?> parameterTypes) | 获得该类某个公有的方法 |
getMethods() | 获得该类所有公有的方法 |
getDeclaredMethod(String name, Class...<?> parameterTypes) | 获得该类某个私有方法 |
getDeclaredMethods() | 获得该类所有方法 |
9. 反射示例
在反射之前,我们需要做的第一步就是先拿到当前反射类的Class对象,然后通过Class对象的核心方法,达到反射的目的,即:在运行状态中,对任意一个类,都能直到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到,那我们就可以进行修改部分类型的信息。
9.1 第一步:拿到当前反射类的Class
1.使用getClass直接获取
2.直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高, 这说明任何一个类都有一个隐含的静态成员变量 class
3.通过getClass直接进行获取,但是要先进行实例化一个对象,使用对象名去调用getClass();
最后创建对象的所有代码为:
9.2 第二步:使用反射
1. 反射私有的构造方法 屏蔽内容为获得公有的构造方法
2. 反射私有属性
3. 反射私有方法
10. 反射的优点与缺点
优点:
1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法
2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力
3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。
缺点:
1. 使用反射会有效率问题。会导致程序效率降低。具体参考这里:大家都说 Java 反射效率低,你知道原因在哪里么_慕课手记
2. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 。