反射
1、概述
反射允许对成员变量,成员方法和构造方法的信息进行编程访问。
注意:获取是从class字节码文件获取的,所以在获取前首先要获取class对象。
2、获取class对象的三种方式(类型为Class)
(1)源代码阶段:方式1
全类名:包名+类名
最为常用
(2)加载阶段:方式2
一般更多的是当做参数进行传递
(3)运行阶段:方式3
当我们已经有了这个类的对象时,才可以使用。
上面的三种方式获取的字节码文件对象是一样的。
3、反射获取构造方法(类型为Constructor)
e.g
Constructor con = clazz.getDeclaredConstructor(String.class)
注意:参数的类型与要获取的构造方法的参数类型保持一致。
con.getModifiers() //构造方法的权限修饰符,返回值为整数,如下图所示:
con.getParameters() //获取该构造方法的参数,并把结果存放到数组中
con.newInstance(这里的参数与构造方法的参数保持一致) //创建实例
注意:不能创建构造函数为private修饰的对象,如果要创建,则要先临时取消权限校验--暴力反射。
方法为:
con.setAccessible(true);
con.newInstance(args);
4、反射获取成员变量(类型为Field)
//获取所有的成员变量
class.getDeclaredFields();
//获取单个成员变量
class.getField(String name); //参数为成员变量名
e.g Field name = class.getField("name");
//获取权限修饰符
int modifiers = name.getModifiers();
//获取成员变量的名字
String n = name.getName();
//获取成员变量的数据类型
Class<?> type = name.getType;
//获取成员变量记录的值
注意:要先创建对象,而且如果要获取私有成员变量的值也要先临时取消权限校验。
假设创建的对象为s
e.g
name.setAccessible(true);
Object value = name.get(s); //这里若知道类型也可以对结果进行强转 如:String value = (String)name.get(s);
//修改对象里面记录的值
name.set(s,"lisi");
5、反射获取成员方法(类型为Method)
//获取指定的单一方法
clazz.getMethod(方法名,参数类型)
e.g Method m = clazz.getDeclaredMethod(“eat”,String.class,int.class)
//获取方法的修饰符
int modifiers = m.getModifiers();
//获取方法的名字
String name = m.getName();
//获取方法的形参
m.getparameters();
//获取方法的抛出的异常
m.getExceptionTypes();
//方法运行
e.g
假设创建的对象实例为s
//参数一:表示方法的调用者
//参数二:表示在调用方法的时候传递的实际参数
m.invoke(s--参数一,"..."--参数二)
注意:如果运行的方法为私有的,也要先临时取消方法的访问权限
6、反射的作用
(1)获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
(2)结合配置文件,动态的创建对象并调用方法
反射跟配置文件结合,动态的创建对象并调用方法
//1、读取配置文件中的信息
Properties prop = new Properties();
FileInputStream fis = new FileInputStream(“配置文件的相对路径”);
prop.load(fils);
fis.close();
//2、获取全类名和方法名
pro.get(“全类名或方法名在配置文件中的键”)
e.g
string className = (String) prop.get("classname");
string methodName = (String) prop.get("method");
//3、利用反射创建对象并运行方法
Class clazz = Class.forName(className);
//获取构造方法
Constructor con = clazz.getDeclaredConstructor();
//创建对象
Object o = con.newInstance();
//获取成员方法并运行
method method = clazz.getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(o);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗