黑马程序员技术交流社区

标题: 通过一个小例子说明下反射 [打印本页]

作者: byr216    时间: 2015-8-11 16:39
标题: 通过一个小例子说明下反射
  1. package com.knowyou.reflect;

  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. /**
  6. *
  7. * 利用反射把一个对象的属性值copy给新的对象
  8. * @author byr216
  9. *
  10. */
  11. public class ReflectTest2 {
  12.         public Object copyStudent(Student st) throws Exception {

  13.                 Class<?> stClass = st.getClass();// 获取对象的class对象
  14.                 Object stObject = stClass.newInstance(); // 创建获取到的class对象的实例

  15.                 // Constructor ct = stClass.getConstructor(String.class, int.class);
  16.                 // Object stObject = ct.newInstance("lisi",45);
  17.                 // System.out.println(ct.getDeclaringClass());

  18.                 Field[] fields = stClass.getDeclaredFields();// 获取获取到的class对象的私有属性集合

  19.                 for (Field field : fields) { // 遍历获取到的属性,并把传入的对象的属性值赋给新对象
  20.                         String m = field.getName(); // 获取属性的名字
  21.                         String setName = "set" + m.substring(0, 1).toUpperCase()
  22.                                         + m.substring(1); // 获取类的set方法名
  23.                         String getName = "get" + m.substring(0, 1).toUpperCase()
  24.                                         + m.substring(1);// 获取类的get方法名
  25.                         Method setMethod = stClass.getMethod(setName, field.getType()); // 获取类的set方法
  26.                         Method getMethod = stClass.getMethod(getName, new Class[0]); // 获取类的get方法
  27.                         Object getField = getMethod.invoke(st, new Object[0]); // 获取传入对象的属性值
  28.                         setMethod.invoke(stObject, getField);// 把获取传入对象的属性值赋给新对象
  29.                 }

  30.                 return stObject;
  31.         }

  32.         public static void main(String[] args) throws Exception {
  33.                 ReflectTest2 rc = new ReflectTest2();
  34.                 Student st = new Student("zhangsan", 23);
  35.                 Student ob = (Student) rc.copyStudent(st);
  36.                 System.out.println(ob.getName() + ":" + ob.getId());
  37.         }
  38. }

  39. class Student {
  40.         private String name;
  41.         private int id;

  42.         public Student() {

  43.         }

  44.         public Student(String name, int id) {
  45.                 this.name = name;
  46.                 this.id = id;
  47.         }

  48.         public String getName() {
  49.                 return name;
  50.         }

  51.         public void setName(String name) {
  52.                 this.name = name;
  53.         }

  54.         public int getId() {
  55.                 return id;
  56.         }

  57.         public void setId(int id) {
  58.                 this.id = id;
  59.         }

  60. }
复制代码



作者: 软件小白    时间: 2015-8-11 17:45
感觉代码好长啊,对于新人来说。
作者: 王哲zhe    时间: 2015-8-11 20:29
{:3_46:}{:3_46:}{:3_46:}{:3_46:}
作者: 晨曦遇晓    时间: 2015-8-11 21:21
{:2_34:}..................




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2