java反射机制与动态代理(二)

来源:百度文库 编辑:神马文学网 时间:2024/04/29 12:58:06

欲生成对象实体,在Reflection 动态机制中有两种作法,一个针对“无自变量ctor”,一个针对“带参数ctor”。如果欲调用的是“带参数ctor“就比较麻烦些,不再调用Class的newInstance(),而是调用Constructor 的newInstance()。首先准备一个Class[]做为ctor的参数类型,然后以此为自变量调用getConstructor(),获得一个专属ctor。接下来再准备一个Object[] 做为ctor实参值,调用上述专属ctor的newInstance()。

 

下面做个例子,该例子的反射对象没有构造方法(实际上是默认的构造方法),无自变量,动态生成“Class object 所对应之class”的对象实体,代码如下:

 

首先建立com.lansin.ghk包,在其下建立两个类:Person.java和Test1.java。

Person.java代码
  1. package com.lansin.ghk;      
  2.      
  3. public class Person{      
  4.           
  5.     private String name;      
  6.           
  7.     private String address;      
  8.      
  9.     public String getName() {      
  10.         return name;      
  11.     }      
  12.      
  13.     public void setName(String name) {      
  14.         this.name = name;      
  15.     }      
  16.      
  17.     public String getAddress() {      
  18.         return address;      
  19.     }      
  20.      
  21.     public void setAddress(String address) {      
  22.         this.address = address;      
  23.     }      
  24.      
  25.     @Override     
  26.     public String toString() {      
  27.         return "名称为" + this.getName() + ", 地址为" + this.getAddress();      
  28.     }      
  29. }   

 

Test1.java代码
  1. package com.lansin.ghk;      
  2.      
  3. import java.lang.reflect.Field;      
  4. import java.lang.reflect.Method;      
  5.      
  6. public class Test1 {      
  7.      
  8.     public static void main(String[] args) throws Exception {      
  9.               
  10.         Class classType = Class.forName("com.lansin.ghk.Person");      
  11.               
  12.         Object obj = null;      
  13.               
  14.         obj = classType.newInstance();      
  15.               
  16.         Field fields[] = classType.getDeclaredFields();      
  17.               
  18.         for(int i=0; i
  19.             Field field = fields[i];      
  20.                   
  21.             String fieldName = field.getName();      
  22.                   
  23.             String firstLetter = fieldName.substring(01).toUpperCase();      
  24.                   
  25.             String getMethodName = "get" + firstLetter + fieldName.substring(1);      
  26.                   
  27.             String setMethodName = "set" + firstLetter + fieldName.substring(1);      
  28.                   
  29.             Method getMethod = classType.getMethod(getMethodName);      
  30.                   
  31.             Method setMethod = classType.getMethod(setMethodName,field.getType());      
  32.                   
  33.             if("name".equals(fieldName)){      
  34.                 setMethod.invoke(obj, "迈克·泰森");      
  35.             }      
  36.             else if("address".equals(fieldName)){      
  37.                 setMethod.invoke(obj, "美国");      
  38.             }                 
  39.         }      
  40.               
  41.         System.out.println(obj);      
  42.     }      
  43. }