Java反射机制详解(一)
第一节主要讲解反射机制的理解以及反射机制的应用:
1.反射(Reflection)的概念
1.1 反射的出现背景
Java程序中,所有的对象都有两种类型:编译时类型
和运行时类型
,而很多时候对象的编译时类型和运行时类型不一致
。
例如:某些变量或形参的声明类型是Object类型,但是程序却需要调用改对象运行时类型的方法,该方法不是Object中的方法,那么该如何解决呢?
解决这个问题,有两种解决方案:
方案1:在编译和运行时都完全知道类型的具体信息,在这种情况下,我们可以直接先使用instanceof
运算法进行判断,再利用强制类型转换将其转换成运行时类型的变量即可。
方案2:编译时无法预知该对象和类的真实信息,程序只能依靠运行时信息来发现该对象和类的真实信息,这时候就必须使用反射。例:Object obj=new String("hello");
。例子中obj变量在编译时是Object类型,但是在运行时,确实String类型,如果我们想要获取obj的运行时类型的话,就可以采用:obj.getClass();
1.2 反射概述
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间
借助Reflection API
取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构。
这个Class对象就像一面镜子,透过这个“镜子”看到类的结构,所以,我们形象地称之为:反射。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqDAQA0q-1688544212869)(D:\Java学习\01_课件与电子教材\尚硅谷_第17章_反射机制\images\image-20220417161529285.png)]
从内存加载上看反射:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ux9qvg33-1688544212870)(D:\Java学习\01_课件与电子教材\尚硅谷_第17章_反射机制\images\image-20220524101441695.png)]
1.3 Java反射机制研究及应用
Java反射机制提供的功能:
- 在运行时判断任意一个对象所属的类:
- 在运行时构造任意一个类的对象:
- 在运行时判断任意一个类所具有的成员变量和方法:
- 在运行时获取泛型信息:
- 在运行时调用任意一个对象的成员变量和方法:
- 在运行时处理注解:
- 生成动态代理:
1.4 反射相关的主要API
java.lang.Class
:代表一个类
java.lang.reflect.Method
:代表类的方法
java.lang.reflect.Field
:代表类的成员变量
java.lang.reflect.Constructor
:代表类的构造器
… …
1.5 反射的优缺点
- 优点:
- 提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力。
- 允许程序创建和控制任何类的对象,无需提前硬编码目标类。
- 缺点:
- 反射的性能较低:反射机制主要应用于对灵活性和扩展性要求很高的系统框架上,日常的业务开发上很少用到。
- 反射会模糊程序代码的内部逻辑,导致代码可读性较差。
和扩展性要求很高的系统框架上,日常的业务开发上很少用到。
- 反射会模糊程序代码的内部逻辑,导致代码可读性较差。
注:关于Java的反射机制讲解,我将拆分成五个小节进行叙述,分为:1、反射的概念;2、理解Class类并代码实现多种方法获取Class实例;3、类的加载与ClassLoader的理解;4、反射的基本应用第一节;5、反射的基本应用及体会。