1. 程式人生 > >Java反射機制總結之二

Java反射機制總結之二

1.要想使用反射,首先需要獲得待處理類或物件所對應的Class物件。

2.獲取某個類或物件所對應的Class地下的常用三中方法

3.若通過類的不帶引數的構造方法來生成物件,我們有兩種方式:

 3.1

 3.2 

4.若想通過帶引數的構造方法生成例項,必須採用3.2的方法才可以。

5.ReflectTest類進一步演示了Reflection APIs的基本使用方法。ReflectTest類有一個copy(Object object)方法,這個方法能夠建立一個和引數object同樣型別的物件,然後把object物件中的所有屬性拷貝到新建的物件中,並將它返回。

這個程式碼示例只能複製簡單的JavaBean,假定JavaBean的每隔屬性都有public型別的getXXX()和setXXX()方法。

程式碼示例:

  1. import java.lang.reflect.Constructor;  
  2. import java.lang.reflect.Field;  
  3. import java.lang.reflect.Method;  
  4. publicclass ReflectTest {  
  5.    //該方法實現對Customer物件的拷貝操作  
  6.     public Object copy(Object object)throws Exception{  
  7.         Class<?>  classtype = object.getClass();  
  8.         //System.out.println(classtype.getName());
  9.         // 使用空構造方法生成示例物件
  10.         Constructor cons = classtype.getConstructor(new Class[]{});  
  11.         Object objectCopy = cons.newInstance(new Object[]{});  
  12.         //以上兩行等價於這一行:Object objectCopy = classtype.newInstance();
  13.         //使用帶引數的構造方法生成示例物件
  14.         //Constructor cons = classtype.getConstructor(new Class[]{String.class,int.class});
  15.         //Object obj = cons.newInstance(new Object[]{"hello",3});
  16.         Field[] fields = classtype.getDeclaredFields();  
  17.         for(Field field:fields){  
  18.             String name = field.getName();  
  19.             //將屬性的首字母轉化為大寫
  20.             String firstLetter = name.substring(01).toUpperCase();  
  21.             String getMethodName ="get"+firstLetter+name.substring(1);  
  22.             String setMethodName = "set"+firstLetter+name.substring(1);  
  23.             Method getMethod = classtype.getMethod(getMethodName, new Class[]{});  
  24.             Method setMethod = classtype.getMethod(setMethodName,new Class[]{field.getType()});  
  25.             Object value = getMethod.invoke(object, new Object[]{});  
  26.             setMethod.invoke(objectCopy, new Object[]{value});            
  27.         }  
  28.         return objectCopy;  
  29.     }  
  30.     publicstaticvoid main(String[] args)throws Exception{  
  31.         Customer customer = new Customer("Tom",20);  
  32.         customer.setId(1L);  
  33.         ReflectTest test= new ReflectTest();  
  34.         Customer customer2 = (Customer)test.copy(customer);  
  35.         System.out.println(customer2.getId()+","+customer2.getName()+","+customer2.getAge());  
  36.         }  
  37. }  
  38. class Customer{  
  39.     private Long id;  
  40.     private String name;  
  41.     privateint age;  
  42.     public Customer(){  
  43.     }  
  44.     public Customer(String name, int age){  
  45.         this.name = name;  
  46.         this.age = age;  
  47.     }  
  48.     public Long getId() {  
  49.         return id;  
  50.     }  
  51.     publicvoid setId(Long id) {  
  52.         this.id = id;  
  53.     }  
  54.     public String getName() {  
  55.         return name;  
  56.     }  
  57.     publicvoid setName(String name) {  
  58.         this.name = name;  
  59.     }  
  60.     publicint getAge() {  
  61.         return age;  
  62.     }  
  63.     publicvoid setAge(int age) {  
  64.         this.age = age;  
  65.     }  
  66. }  
執行結果:

1,Tom,20

本文參考:

第六十三講 反射機制大總結:http://www.iqiyi.com/w_19rr26m6gp.html