Java反射机制
来源:互联网 发布:域名邮箱申请条件 编辑:程序博客网 时间:2024/06/08 06:02
一、案例
1. 运行时利用带参构造方法生成类实例
利用Constructor的newInstance()方法,首先准备一个Class[]数组作为Constructor的参数类型,然后调用Class对象的getConstructor()方法获得一个专属的Constructor对象,最后再准备一个Object[]作为Constructor对象newInstance()方法的实参
// 利用反射构造带参数的类的实例// 得到类实例Class clazz = Class.forName(User.class.getName());Class[] paramType = new Class[] { String.class, int.class, String.class };// 得到构造方法Constructor constructor = clazz.getConstructor(paramType);// 实例构造方法的参数数组Object[] params = new Object[] { "Paulz", 29, "111111" };// 利用带参构造方法实例类Object obj = constructor.newInstance(params);System.out.println(((User) obj).getUserName());// 结果:Paulz
2. cope一个对象,封装各个属性值
public static Object copy(Object obj) throws Exception {// 获得对象的类型Class clazz = obj.getClass();System.out.println("该对象的类型是 = " + clazz.getName());// 通过默认构造方法创建一个新的对象,视其参数动态决定调用哪个构造函数Object objectCopy = clazz.getConstructor(new Class[] {}).newInstance(new Object[] {});// 获得对象的所有属性,包括私有属性Field[] fields = clazz.getDeclaredFields();for (int i = 0; i < fields.length; i++) {Field field = fields[i];// 获得数组中对应的属性名称String fieldName = field.getName();// 获得相应属性的getter和setter方法名称String letter = fieldName.substring(0, 1).toUpperCase();String getName = "get" + letter + fieldName.substring(1);String setName = "set" + letter + fieldName.substring(1);// 获得相应的getter和setter方法Method getMethod = clazz.getMethod(getName, new Class[] {});Method setMethod = clazz.getMethod(setName, new Class[] { field.getType() });// 调用源对象的getter方法Object value = getMethod.invoke(obj, new Object[] {});System.out.println("value = " + value);// 调用copy的setter方法,将源对象值赋给新对象对应的方法setMethod.invoke(objectCopy, new Object[] { value });}return objectCopy;}
二、实现例子
ReflectUtils代码:
package reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Map;public class ReflectUtils {/** * 利用带参构造方法生成类实例 * * @param map * 参数 * @param clazz * 返回类类型 * @return * @throws Exception * @throws */public static <T> T getObject(Map<String, Object> map, Class<T> clazz) throws Exception {if (map == null) {return null;}Constructor<T> constructor = clazz.getConstructor(Map.class);T obj = constructor.newInstance(map);return obj;}/** * 拷贝一个新对象 * * @param obj * 对象 * @param clazz * 对象类型 * @return * @throws Exception */@SuppressWarnings("unchecked")public static <T> T copy(T obj) throws Exception {// 获得对象的类型Class<T> clazz = (Class<T>) obj.getClass();// 通过默认构造方法创建一个新的对象T objCopy = clazz.newInstance();// 获得对象的所有属性,包括私有属性Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 获得属性名称String fieldName = field.getName();// 获得相应的属性的getter和setter方法名称String letter = fieldName.substring(0, 1).toUpperCase();String getName = "get" + letter + fieldName.substring(1);String setName = "set" + letter + fieldName.substring(1);Method getMethod = clazz.getMethod(getName, new Class[] {});Method setMethod = clazz.getMethod(setName, new Class[] { field.getType() });// 调用源对象的getter方法Object value = getMethod.invoke(obj, new Object[] {});// 调用copy的setter方法,将源对象值赋给新对象对应的方法setMethod.invoke(objCopy, new Object[] { value });}return objCopy;}}
User代码:
package reflect;import java.util.Map;public class User {private String userName;// 姓名private Integer age;// 年龄public String password;// 密码public User() {}/** * 带参数的构造函数 * * @param userName * 姓名 * @param age * 年龄 * @param password * 密码 */public User(String userName, Integer age, String password) {this.userName = userName;this.age = age;this.password = password;}/** * 带参数的构造函数 * * @param map * 参数 */public User(Map<String, Object> map) {if (map == null) {throw new IllegalArgumentException("user");}this.userName = String.valueOf(map.get("userName"));this.age = Integer.valueOf(String.valueOf(map.get("age")));this.password = String.valueOf(map.get("password"));}@Overridepublic String toString() {return "[ Name = " + this.userName + " | age = " + this.age + " | Password = " + this.password + " ]";}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}
ReflectTest代码:
package reflect;import java.util.HashMap;import java.util.Map;public class ReflectTest {public static void main(String[] args) {Map<String, Object> map = new HashMap<String, Object>();map.put("userName", "殷建卫");map.put("age", 28);map.put("password", "123456");User user = null;try {// 创建对象user = ReflectUtils.getObject(map, User.class);System.out.println("user对象:" + user.toString());// 拷贝对象User userCopy = ReflectUtils.copy(user);System.out.println("userCopy对象:" + userCopy.toString());} catch (Exception e) {e.printStackTrace();}}}
输出:
user对象:[ Name = 殷建卫 | age = 28 | Password = 123456 ]
userCopy对象:[ Name = 殷建卫 | age = 28 | Password = 123456 ]
0 0
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- dataguard初始化参数
- 风风光光
- 码垛
- 设置textview lable的行间距
- SearchMatrix@Leetcode
- Java反射机制
- jdbc与hibernate的优缺点比较
- 光有想法怎么开技术公司?
- mac 下更新 .bash_profile 文件
- poj 1050 To the Max(最大子矩阵和)
- 免费玩家和付费玩家的顶级英雄和装备的产出平衡
- UVa 111 - History Grading
- C#枚举
- log_archive_dest_n参数的属性