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
原创粉丝点击