(java)从零开始之-反射Reflect
2024-09-06 17:52:55
反射: 当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,我们就可以使用字节码对象设置对象的属性或者调用对象的方法等操作
这里记录下反射的简单使用,方便查阅
/*******************
获取class
*******************/
//Class clazz = Person.class;//方式一,通过类名获取
//Class clazz = new Person().getClass();//方式二,通过对象获取
Class clazz = Class.forName("reflect.Person");//方式三,通过完成限定名获取。参数为(包名+类名)。推荐使用,也是最常用 /*******************
获取某class的构造方法
******************/
//Constructor[] constructor = clazz.getConstructors();//获取所有共有构造方法
//Constructor[] constructor = clazz.getDeclaredConstructors();//获取所有构造方法
//Constructor constructor = clazz.getConstructor(String.class,String.class);//获取某一个构造方法(不包括私有构造方法),参数为null表示获取无参构造方法
Constructor constructor = clazz.getDeclaredConstructor(String.class,String.class);//获取某一个构造方法(包括私有构造方法),参数为null表示获取无参构造方法
/*******************
执行构造方法
******************/
constructor.setAccessible(true);//如果构造方法为私有,则需改变访问修饰权限
Person p =(Person) constructor.newInstance("100","jiuxiangfeng1");//参数为null表示执行无参构造方法 /*******************
获取方法
******************/
//Method[] method = clazz.getMethods();//获取所有共有方法
//Method[] method = clazz.getDeclaredMethods();//获取所有方法
//Method method = clazz.getMethod("setName",String.class);//获取某个方法(不包括私有方法),第二个为可变参数,如果第二个参数为null表示该方法没有参数
Method method = clazz.getMethod("setName",String.class);//获取某个方法(包括私有方法),第二个为可变参数,如果第二个参数为null表示该方法没有参数
/*******************
执行方法
******************/
//method.setAccessible(true);//如果方法为私有,执行前需改变访问修饰权限,否则会引发异常
method.invoke(p, "jiuxiangfeng2");//第一个参数为方法执行的对象,如果是静态方法,第一个参数应为null,第二个参数为可变参数,如果第二个参数为null表示该方法没有参数 /*******************
获取成员变量
******************/
//Field[] field = clazz.getFields();//获取所有公共成员变量
//Field[] field = clazz.getDeclaredFields();//获取所有成员变量
//Field field = clazz.getField("name");//获取单个公共成员变量。参数为成员变量名
Field field = clazz.getDeclaredField("name");//获取单个成员变量。参数为成员变量名
/*******************
设置成员变量的值
******************/
field.setAccessible(true);//如果为私有成员变量,那么应该改变其访问修饰权限为可以访问,否则引发异常
field.set(p, "jiuxiangfeng3");//设置某个对象成员变量的值. 参数1为哪个对象,参数2为其成员变量的值
System.out.println(p);
以上代码执行都假设有一个Person.class
package reflect;
public class Person {
public String id;
public String name; public Person(String id, String name) {
super();
this.id = id;
this.name = name;
}
public Person() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return this.id+"="+this.name;
}
}
最新文章
- iis 访问网站需要进行身份验证
- PHP中的预定义超全局数组
- jquery实现抽奖小游戏
- Excel常用的格式处理
- 【缩点+拓扑判链】POJ2762 Going from u to v or from v to u?
- elementUi源码解析(1)--项目结构篇
- wiki
- ofo C++面试
- idea基于hibernate生成的Entitle对象,会忽略外键属性
- 青铜到王者,快速提升你 MySQL 数据库的段位!
- e617. Determining the Opposite Component of a Focus Event
- 定时任务,AlarmManager使用
- hdu-1711(kmp算法)
- MT【122】一个重要的不平凡的无穷级数
- IOS计算文字高度
- ★ java删除代码注释
- linux 一个网卡配置多个IP
- 【Oozie】ambari安装oozie失败
- 《DSP using MATLAB》示例 Example 6.11
- ADB命令详解及大全( 声明:此文是参考大佬博客所做的笔记!)