- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- /**
- * 通过反射机制来复制JavaBean对象
- * @author WalkingDog
- *
- */
- public class Reflect {
- public static void main(String[] args) throws Exception {
- Person person = new Person("walkingdog", 20);
- person.setId(2009324116L);
- Person personCopy = (Person)new Reflect().copy(person);
- System.out.println(personCopy.getId() + " " + personCopy.getName() + " " + personCopy.getAge());
- }
- public Object copy(Object object) throws Exception{
- //要想使用反射,首先需要获得待处理类或对象所对应的Class对象
- //下面是获取Class对象的常用的3种方式
- //获得运行时的类
- Class<?> classType = object.getClass();
- //Class<?> classType = Costomer.class;
- //Class<?> classType = Class.forName("Costomer");
- Constructor<?> constructor = classType.getConstructor(new Class<?>[]{});
- Object objectCopy = constructor.newInstance(new Object[]{});
- //以上两行代码等价于下面一行代码,newInstance()只能通过无参构造方法建立对象。
- //Object objectCopy = classType.newInstance();
- Field fields[] = classType.getDeclaredFields();
- for(Field field : fields){
- String name = field.getName();
- String firstLetter = name.substring(0, 1).toUpperCase();
- //获得属性的set、get的方法名
- String getMethodName = "get" + firstLetter + name.substring(1);
- String setMethodName = "set" + firstLetter + name.substring(1);
- Method getMethod = classType.getMethod(getMethodName, new Class<?>[]{});
- Method setMethod = classType.getMethod(setMethodName, new Class<?>[]{field.getType()});
- //获得copy对象的属性值
- Object value = getMethod.invoke(object, new Object[]{});
- //设置被copy对象的属性值
- setMethod.invoke(objectCopy, value);
- }
- return objectCopy;
- }
- }
- //JavaBean
- class Person{
- private Long id;
- private String name;
- private int age;
- //每个JavaBean都应该实现无参构造方法
- public Person() {}
- public Person(String name, int age){
- this.name = name;
- this.age = age;
- }
- //setter、getter方法
- }
初始反射
最新推荐文章于 2024-11-04 22:26:34 发布