数据结构系列16——反射

目录

1. 定义

2. 反射相关的类

3. Class类

4. Class类中的相关方法

5. Field类中的相关方法

6. 获得类中注解相关的方法

7.获得类中构造器相关的方法

8. 获得类中方法相关的方法

9. 反射示例

9.1 第一步:拿到当前反射类的Class 

9.2 第二步:使用反射

​10. 反射的优点与缺点


1. 定义

    java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够直到这个类的所有属性和方法对于任意一个对象,都能调用它的任意方法和属性,我们也随之就可以进行修改部分类型的信息;这种动态获取信息以及动态调用对象方法的功能成为java语言的反射机制。

2. 反射相关的类

数据结构系列16——反射_第1张图片

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. 获得类中注解相关的方法

数据结构系列16——反射_第2张图片

7.获得类中构造器相关的方法

数据结构系列16——反射_第3张图片

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();

最后创建对象的所有代码为:

数据结构系列16——反射_第4张图片

9.2 第二步:使用反射

1. 反射私有的构造方法 屏蔽内容为获得公有的构造方法

数据结构系列16——反射_第5张图片

数据结构系列16——反射_第6张图片 2. 反射私有属性

数据结构系列16——反射_第7张图片

数据结构系列16——反射_第8张图片 3. 反射私有方法

数据结构系列16——反射_第9张图片

数据结构系列16——反射_第10张图片10. 反射的优点与缺点

优点:
1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法
2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力
3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。

 缺点:
1. 使用反射会有效率问题。会导致程序效率降低。具体参考这里:大家都说 Java 反射效率低,你知道原因在哪里么_慕课手记
2. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 。

 

 

你可能感兴趣的:(数据结构,java)