反射

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

posted @   Linqylin  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示