JAVA中反射机制一
声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223
反射一 基本概念
一、反射机制的基本概念
什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的任意方法和属性;这种动态获取信息及动态调用对象的方法,称为JAVA语言的反射机制。
二、反射可以做什么
我知道了反射的概念,那么反射可以做什么呢?
- 在运行时可以判断任意一个对象是否属于所属的类
- 在运行期可以构造任意一个对象
- 在运行期可以获取一个类的成员变量或者方法
- 在运行期可以去调用一个对象的方法
三、反射的相关类
在JDK 中,主要有以下类来实现JAVA反射机制,这些类(除了第一个)都位于java.lang.reflect包中
Class类:代表一个类,位于java.lang包下。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
四、反射的基本原理
要实现反射功能,那么需要经过加载类,和解析类两个步骤;所谓加载类,即将类的字节码加载到内存中去,然后去解析这个类,从而得到所要的属性或者方法。
例如:用于反射的类,如Method,可以在java.lang.reflect包中找到。使用这些类的时候必须要遵循三个步骤:
第一步:获得你想操作的类的java.lang.Class对象。在运行中的Java程序中,用java.lang.Class类来描述类和接口等。
第二步:调用诸如getDeclaredMethods的方法,取得该类中定义的所有方法的列表。
第三步:使用反射的API来操作这些信息。
五、加载类,即获取Class对象的三种方式
1.使用Class类的静态方法。例如:
Class.forName("java.lang.String");
2.使用类的.class语法。如:
String.class;
3.使用对象的getClass()方法。如:
String str = "aa";
Class<?> classType1 = str.getClass();
getClass()方法定义在Object类中,不是静态方法,需要通过对象来调用,并且它声明为final,表明不能被子类所覆写。
直接print所获得的Class对象classType会输出:
class 完整类名
如果调用该Class对象的getName()方法,则输出完整类名,不加class。
六、实例演示
package study.reflect; public class Demo01 { /** * 反射,加载类,获取类的字节码 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //1. Class<?> clazz = Class.forName("study.reflect.Person"); //2. Class<?> clazz1 = new Person().getClass(); //3. Class<?> clazz2 = Person.class; /** * 通过上面的三种方式,加载类已经完成,获取到了类的字节码,那么Class 提供了那些方法呢? * public Constructor<T> getConstructor(Class<?>... parameterTypes) public Method getMethod(String name,Class<?>... parameterTypes) public Field getField(String name) * * 也就说,和定义里面说的一样,我们可以拿到类的属性,方法 ,构造函数等相关的东西 * * */ } }
七、思考,我们解剖出了这些成员后有什么用呢?
提示:构造函数,创建对象;属性,用于保存数据;方法,可以执行某些功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端