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[][][]之间的转化。