JAVA语言的反射机制

来源:互联网 发布:网络投资平台骗局揭秘 编辑:程序博客网 时间:2024/05/23 19:23

在JDK中,主要由以下类来实现JAVA反射机制,这些类都位于java.lang.reflect包中。

Class类:代表一个类。

Field类:代表类的属性。

Method:代表类的方法。

Constructor类:代表类的构造方法。

 

下面的ReflectTester类演示了Reflection API的基本使用方法,ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回。

 

ReflectTester类:

  1. package mypack;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. public class ReflectTester {
  5.     
  6.     public Object copy(Object object)throws Exception{
  7.         
  8.         //获得对象类型
  9.         Class classType=object.getClass();
  10.         System.out.println("Class:"+classType.getName());
  11.         
  12.         //通过默认构造方法创建一个新的对象
  13.         Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
  14.         
  15.         //获得所有对象的属性
  16.         Field fields[]=classType.getDeclaredFields();
  17.         
  18.         for(int i=0;i<fields.length;i++)
  19.         {
  20.             Field field=fields[i];
  21.             
  22.             String fieldName=field.getName();
  23.             String firstLetter=fieldName.substring(0,1).toUpperCase();
  24.             
  25.             //获得和属性对应的getXXX()方法的名字
  26.             String getMethodName="get"+firstLetter+fieldName.substring(1);
  27.             
  28.             //获得和属性对应的setXXX()方法的名字
  29.             String setMethodName="set"+firstLetter+fieldName.substring(1);
  30.             
  31.             //获得和属性对应的getXXX()方法
  32.             Method getMethod=classType.getMethod(getMethodName, new Class[]{});
  33.             //获得和属性对应的setXXX()方法
  34.             Method setMethod=classType.getMethod(setMethodName, new Class[]{field.getType()});
  35.             
  36.             //调用原对象的getXXX()方法
  37.             Object value=getMethod.invoke(object, new Object[]{});
  38.             System.out.println(fieldName+":"+value);
  39.             
  40.             //调用拷贝对象的setXXX()方法
  41.             setMethod.invoke(objectCopy, new Object[]{value});
  42.             
  43.         }
  44.         return objectCopy;
  45.     }
  46.     /**
  47.      * @param args
  48.      */
  49.     public static void main(String[] args)throws Exception {
  50.         Customer customer=new Customer("Tom",21);
  51.         customer.setId(new Long(1));
  52.         
  53.         Customer customerCopy=(Customer)new ReflectTester().copy(customer);
  54.         System.out.println("copy information: "+customerCopy.getName()+" "+customer.getAge());
  55.     }
  56. }

 

Customer类:

  1. package mypack;
  2. public class Customer {
  3.     private Long id;
  4.     private String name;
  5.     private int age;
  6.     
  7.     public Customer() {
  8.         super();
  9.         // TODO Auto-generated constructor stub
  10.     }
  11.     public Customer(String name,int age){
  12.         this.name=name;
  13.         this.age=age;
  14.     }
  15.     public Long getId() {
  16.         return id;
  17.     }
  18.     public void setId(Long id) {
  19.         this.id = id;
  20.     }
  21.     public String getName() {
  22.         return name;
  23.     }
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27.     public int getAge() {
  28.         return age;
  29.     }
  30.     public void setAge(int age) {
  31.         this.age = age;
  32.     }
  33.     
  34. }

[注:]Customer类必须提供无参构造,否则运行ReflectTester类时会抛出如下异常:

Class:mypack.Customer
Exception in thread "main" java.lang.NoSuchMethodException: mypack.Customer.<init>()
 at java.lang.Class.getConstructor0(Unknown Source)
 at java.lang.Class.getConstructor(Unknown Source)
 at mypack.ReflectTester.copy(ReflectTester.java:15)
 at mypack.ReflectTester.main(ReflectTester.java:56)

原创粉丝点击