怎么利用java放射机制进行对象的实例化等操作
来源:互联网 发布:python strip 多个 编辑:程序博客网 时间:2024/06/05 09:29
大家看demo就明白了:
User.java:
package test;/** * @编写人: yh.zeng * @编写时间:2017-7-10 下午9:26:18 * @文件描述: todo */public class User {private String userName; // 用户名public Integer age; // 年龄private String getUserName() {return userName;}private void setUserName(String userName) {this.userName = userName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}
Test.java:
package test;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * @编写人: yh.zeng * @编写时间:2017-7-11 下午1:08:05 * @文件描述: todo */public class Test {/** * 获取类定义的非public字段(如private、protected等) * @param targetClass 目标类 * @param fieldName 字段名 * @return * @throws Exception */public static Field getPrivateField(Class targetClass, String fieldName) throws Exception{Field field = targetClass.getDeclaredField(fieldName);field.setAccessible(true); //不检查该字段的访问权限,否则使用Field.get()(即获取不到该字段数据的时候),可能会报错return field;}/*** * 获取类定义的pulic字段 * @param targetClass 目标类 * @param fieldName 字段名 * @return * @throws Exception */public static Field getPublicField(Class targetClass, String fieldName) throws Exception{return targetClass.getField(fieldName);}/** * 获取类定义的非public方法(如private、protected等) * @param targetClass 目标类 * @param methodName 方法名 * @param parameterTypes 方法参数类型 * @return * @throws Exception */public static Method getPrivateMethod(Class targetClass, String methodName, Class<?>... parameterTypes) throws Exception{Method method = targetClass.getDeclaredMethod(methodName, parameterTypes);method.setAccessible(true); //不检查该方法的访问权限,否则使用Method.invoke()(即调用实例对象的该方法的时候),可能会报错return method;}/** * 获取类定义的public方法 * @param targetClass 目标类 * @param methodName 方法名 * @param parameterTypes 方法参数类型 * @return * @throws Exception */public static Method getPublicMethod(Class targetClass, String methodName, Class<?>... parameterTypes) throws Exception{return targetClass.getMethod(methodName, parameterTypes);}/** * 获取类定义个非public构造方法,如(如private、protected等) * @param targetClass 目标类 * @param parameterTypes 构造方法参数类型 * @return * @throws Exception */public static Constructor getPrivateConstructor(Class targetClass, Class<?>... parameterTypes) throws Exception{Constructor constructor = targetClass.getDeclaredConstructor(parameterTypes);constructor.setAccessible(true); //不检查该构造方法的访问权限,否则使用Constructor.newInstance()(即实例化对象的时候),可能会报错 return constructor;}/** * 获取类定义个public构造方法 * @param targetClass 目标类 * @param parameterTypes 构造方法参数类型 * @return * @throws Exception */public static Constructor getPublicConstructor(Class targetClass, Class<?>... parameterTypes) throws Exception{return targetClass.getConstructor(parameterTypes);}public static void main(String args[]) throws Exception{Class clazz = Class.forName("test.User");Object instance = getPublicConstructor(clazz).newInstance();//获取字段值Field userNameField = getPrivateField(clazz, "userName");System.out.println("userName = " + userNameField.get(instance) );Field ageField = getPrivateField(clazz, "age");System.out.println("age = " + ageField.get(instance) );//调用相应方法设值Method setUserNameMehod = getPrivateMethod(clazz, "setUserName", String.class);setUserNameMehod.invoke(instance, "aa");Method setAge = getPrivateMethod(clazz, "setAge", Integer.class);setAge.invoke(instance, 18);//再次获取字段值System.out.println("userName = " + userNameField.get(instance) );System.out.println("age = " + ageField.get(instance) );}}
Test.java程序运行结果如下:
userName = nullage = nulluserName = aaage = 18
备注:
- 获取非public字段,就一定要使用Class.getDeclaredField来获取
- 获取public字段,即可以使用Class.getField,也可以使用Class.getDeclaredField,所以推荐字段的获取一律使用Class.getDeclaredField
- 获取非public方法,就一定要使用Class.getDeclaredMethod来获取
- 获取public方法,即可以使用Class.getMethod,也可以使用Class.getDeclaredMethod,所以推荐方法的获取一律使用Class.getDeclaredMethod
- 获取非public构造方法,就一定要使用Class.getDeclaredConstructor来获取
- 获取public构造方法,即可以使用Class.getConstructor,也可以使用Class.getDeclaredConstructor,所以推荐方法的获取一律使用Class.getDeclaredConstructor
- 字段、方法以及构造方法,一定要设置setAccessible(true),否则可能会报无权限访问的错误
阅读全文
0 0
- 怎么利用java放射机制进行对象的实例化等操作
- 利用java反射机制进行对象操作
- 利用java反射机制进行对象操作
- java 放射机制简介
- 什么是java放射机制
- java中通过放射机制创建对象的两种方式
- java中通过放射机制创建对象的两种方式
- Java学习之路——利用JDOM对xml文档进行解析等操作实例
- java放射机制(invoke)
- JAVA 放射、类的加载机制与垃圾回收
- java反射机制(一)—— 利用反射机制实例化对象
- java反射机制—— 利用反射机制实例化对象
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- Java中的反射机制 一个利用反射进行对象拷贝的例子
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- java 类的放射-方法
- 利用JNI进行对象操作
- 利用JNI进行对象操作
- 微软发布 Microsoft 365,它包含Office 365、Windows 10 和企业移动性+安全性套件
- Cesium学习笔记(八):Demo学习(差值器)
- Android zxing二维码扫描 扫描框适应各种分辨率
- 秒杀系统思路以及优化
- java中的MD5加密
- 怎么利用java放射机制进行对象的实例化等操作
- [LeetCode] 581. Shortest Unsorted Continuous Subarray
- Makefile文件调试跟踪打印警告错误信息
- escape,encodeURI,encodeURIComponent有什么区别?
- OMNeT++5安装笔记
- CodeForces 699C Vacations 贪心
- HTTP传输协议,包括HttpUrlConnection和HttpClient。
- Jquery与Ajax学习笔记
- 2017年7月1日河南少林寺洛阳龙门石窟一日游