【原】Java Reflection 之 Method

【原】Java Reflection 之 Method
【1】Method类简介 Java反射技术的一个基本应用之一就是在运行时期间动态地调用方法。要动态地调用方法,首先要获得方法本身。步骤如下:
  1.获得Class对象
  2.调用Class对象的getMethod(String, Class[])方法获得指定的方法
 
getMethod方法的第一个参数用来指定方法的名称,第二个参数是一个Class数组,用来存放代表各个参数类型的Class对象。这个方法有一个值得注意的地方:
 
如果参数类型是原子类型(int,long,short等),要使用诸如int.class,long.class来获取其对应Class对象,而不能使用对应的封装类对象。
 
在获得Method对象之后,就可以在运行时动态地调用方法了。Method类里面最主要的方法有以下几种
  1.获取方法所在的类:                     getDeclaringClass()
  2.获取方法签名中所有声明的抛出异常:getExceptionTypes()
  3.获取方法签名中所有参数的类型:     getParameterTypes()
  4.获取方法签名中返回值的类型:        getReturnType()
  5.调用方法:                               Object invoke(Object obj, Object... args)
 
Method类的核心就是invoke方法,该方法用于Method对象唤起对象中对应的方法,特别要注意的是第二个参数:通常这是一个Object数组,这意味着如果参数是原子类型数据,必须先把他转换成对应的封装类对象,invoke方法会在后台自动将其解压成原子类型。
 
从JDK1.5开始之后,增加了"自动装箱"和"自动开箱"的功能,所以你可以看到在行61处,使用了原子类型数据而非封装类来传递参数。如果是在JDK1.4或以下版本,则此处会报错。建议不采用此种做法,以免出现数据类型完全的问题。


【2】使用反射拷贝对象的思路  1. 获取源对象的所有成员变量列表

 2. 每次取出变量列表中的一个变量,获取其getXxx()和setXxx(Type)方法名称

 3. 根据getXxx()和setXxx(Type)方法名称获得对应的Method对象

 4. 源对象通过invoke(Object, Class[])方法调用getXxx()方法,获得成员变量的值

 5. 目标对象通过invoke(Object, Class[])的方法的setXxx(Type)方法,为目标对象的成员变量赋值
  
其中关键的代码段格式如下:

 1. 创建Method对象:Class.getMethod(method name, method prameters class array)

 2. 调用方法:method.invoke(object, method parameters class array)


【3】示例代码
        //  获得对象的所有属性
        Field fields[]  =  classType.getDeclaredFields();

        
for  ( int  i  =   0 ; i  <  fields.length; i ++ ) {
            Field field 
=  fields[i];

            String fieldName 
=  field.getName();
            String firstLetter 
=  fieldName.substring( 0 1 ).toUpperCase();

            
//  获得和属性对应的getXXX()方法的名字
            String getMethodName  =   " get "   +  firstLetter  +  fieldName.substring( 1 );
            
//  获得和属性对应的setXXX()方法的名字
            String setMethodName  =   " set "   +  firstLetter  +  fieldName.substring( 1 );

            
//  获得和属性对应的getXXX()方法
            Method getMethod = classType.getMethod(getMethodName,
                    new Class[] {});
            
//  获得和属性对应的setXXX()方法,使用filed对象的类型
            Method setMethod  =  classType.getMethod(setMethodName,
                    
new  Class[] { field.getType() });

            
//  调用原对象的getXXX()方法:指定调用的对象和方法的参数值列表
            Object value = getMethod.invoke(object, new Object[] {});
            System.out.println(fieldName 
+   " : "   +  value);
            
//  调用拷贝对象的setXXX()方法:指定调用的对象和参数值列表(注意必须是Object类型)
            setMethod.invoke(objectCopy, new Object[] { value });
        }


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。

你可能感兴趣的:(【原】Java Reflection 之 Method)