java反射机制(2)

    这个相当于是对第一部分的补充说明,主要是想演示一下利用反射机制对一个对象进行拷贝,从而体现出对于Field类和Array类的使用情况。

package com.javase.reflectionfuther;

public class original {

    int age;
    String name;
    int grade;
    
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getGrade() {
        return grade;
    }
    public void setGrade(int grade) {
        this.grade = grade;
    }
}
package com.javase.reflectionfuther;

import java.lang.reflect.*;

public class testCopy {
    //利用反射实现copy一个类
    public static Object copy(Object object) throws Exception{
        
        Class<?>classType=object.getClass();
        //如果没有构造函数的时候会比较麻烦  相当于在copy函数中要把所有的函数都模拟出来
        //在之前的例子中 要是有构造函数的时候 
        //直接通过返回constructor,之后通过constructor.newInstance传入新的参数就可以出来新的实例
        Object objCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
        
        //获取field属性    
        Field[] fields=classType.getDeclaredFields();
        for (Field field:fields)
        {
           String name=field.getName();
           //System.out.println(name);
           String firstletter=name.substring(0,1).toUpperCase();
           //生成这个属性对应的get和set方法
           String getMethodname="get"+firstletter+name.substring(1,name.length());
           String setMethodname="set"+firstletter+name.substring(1,name.length());
           //获取方法
           Method getMethod=classType.getMethod(getMethodname, new Class[]{});
           //注意这里getName与getType的区别
           //对于属性int age 
           //则getName返回的是age getType返回的是int
           Method setMethod=classType.getMethod(setMethodname, new Class[]{field.getType()});
           
           //通过反射调用object类的方法 
           Object value=getMethod.invoke(object,new Object[]{});
           //通过反射调用objCopy实例的 set方法 把值传入进去
           setMethod.invoke(objCopy, new Object[]{value});

        }
        
        
        return objCopy;
    }
    
    public static void main(String[]args) throws Exception
    {
        //对于copy函数的测试
        original org=new original();
        org.setAge(25);
        org.setGrade(98);
        org.setName("wz");
        original copyorg=(original)copy(org);
        System.out.println(copyorg.getAge()+";"+copyorg.getGrade()+";"+copyorg.getName());
        
        
        //对于Array类的简单测试 Array类中好多都是静态的方法
        Class<?>classType=Class.forName("java.lang.String");
        //返回一个array数组 每个元素的类型是classType长度是10
        Object array=Array.newInstance(classType, 10);
        Array.set(array,5,"hello");
        //返回array对象的第5个位置的元素 
        String str=(String)Array.get(array, 5);
        System.out.println(str);
        
        //定义array的三个维度为5 10 15
        int[] dims=new int[]{5,10,15};
        //第一个参数是数组中每个元素类型 第二个是维度信息 三维数组的长宽高是 5 10 15
        Object triplearray=Array.newInstance(Integer.TYPE, dims);
        Object arrayobj=Array.get(triplearray,3);
        arrayobj=Array.get(arrayobj,5);
        Array.set(arrayobj, 10, 37);
        int [][][]arrayCast=(int [][][])triplearray;
        System.out.println(arrayCast[3][5][10]);
        
    }

}

输出结果:

25;98;wz
hello
37

    感觉对着代码说比较容易,第一部分定义了一个original类,我们就是要对这个类进行拷贝。通过第一部分的内容我们可以知道,其实完全可以通过反射机制返回一个constructor对象,再通过constructor的newinstance方法生成一个新的对象,针对拷贝一个对象而言,定义构造函数显然拷贝起来更容易一些,要不然我们就得使用上面代码中的方法,通过返回Field,来逐一的生成每个属性的set和get方法,逐一地进行赋值,这样就比较麻烦了,但是是最基本最朴素的方法。

    再往后的代码主要是演示了一下Array类的使用,比如get方法,以及newInstance方法,以及Object对象与int[][][]之间的转化。

posted @ 2014-06-19 20:03  hessen  阅读(233)  评论(0编辑  收藏  举报