JAVA 中的反射(reflact)
2024-10-08 22:05:48
获取反射加载类(获取类的字节码)的3种方式:
- Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
- Class class2 =new Person().getClass();
- Class class3=Person.class;
在JAVA中,解剖类Class提供的常用方法:
- public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public类型构造函数
- public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取private类型构造函数
例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person"); Constructor c= class1.getDeclaredConstructor(String.class);
c.setAccessible(true); //暴力破解
c.newInstance("张三");
- public Method getMethod(String name, Class<?>... parameterTypes) 获取类的public类型方法
- public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 获取类的private类型方法
例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Person p=(Person)class1.newInstance();
Method method= class1.getDeclaredMethod("Head", String.class);
method.setAccessible(true);//打开访问权限
method.invoke(p, "李四");
获取静态方法并执行:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
//Person p=(Person)class1.newInstance();
Method method= class1.getMethod("Head", Integer.class);
method.invoke(null, "李四");
注意:反射调用参数为数组时,反射会进行拆解。例:
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
//Person p=(Person)class1.newInstance();
Method method= class1.getMethod("main", String[].class);
method.invoke(null, (Object)new String[] {"12"});
//此处需要做参数包装,不做包装,反射会进行拆解数组参数,最终为:main(String s1),
//与期望main(String [] args) 不相同
- public Field getField(String name) 获取类public类型字段方法。
例:
@Test
public void func7() {
try {
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Person p=(Person) class1.newInstance();
Field name=class1.getField("name");
//设置字段值:
name.set(p, "张飞");
//读取值
Object object=name.get(p);
//获取字段类型
Class type=name.getType();
if(type.equals(String.class)) {
String vString=(String) object;
System.out.println(vString);
}
//2 .
System.out.println(p.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
- public Field getDeclaredField(String name) 获取private 字段方法。
例:
@Test
public void func8() {
try {
Class class1=Class.forName("lession_svc.lession_svc.reflact.Person");
Person p=(Person) class1.newInstance();
Field name=class1.getDeclaredField("age");
name.setAccessible(true);
//设置字段值:
name.set(p, 12);
//读取值
Object object=name.get(p);
//获取字段类型
Class type=name.getType();
if(type.equals(String.class)) {
String vString=(String) object;
System.out.println(vString);
}
//2 .
System.out.println(p.getAge());
} catch (Exception e) {
e.printStackTrace();
}
}
最新文章
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)
- Global Translator
- 【SDOI2008】解题汇总
- substr
- Material Design之TextInputLayout、Snackbar的使用
- java_method_readFile读取文件文本xls
- SQL Server 移动数据库
- eclipse中注释常用关键字
- Java 异常处理笔记
- 微信小程序报错:id 属性值格式错误。如不能以数字开头。
- Python测试框架之Unittest梳理
- 【OpenCV】选择ROI区域 (转)
- #Java学习之路——基础阶段二(第十篇)
- python 实现图的深度优先和广度优先搜索
- 廖雪峰Java1-3流程控制-6 do-while循环
- AngularJS table 按照表头字段排序功能(升序和降序)
- 解题:HAOI 2015 按位或
- go语言之进阶篇正则表达式
- PostgreSQL 9.3:在windows(包括win7)下的安装与正确配置
- <;深入理解JavaScript>;学习笔记(5)_强大的原型和原型链