Java类反射中所必须的类:
????? Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,下面我将对这些类做一个简单的说明。
Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。
Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。
Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
package example1; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectTester { /** * 在这个类里面存在有copy()方法,根据指定的方法的参数去 构造一个新的对象的拷贝 并将他返回 * * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalAccessException * @throws InstantiationException * @throws SecurityException * @throws IllegalArgumentException */ public Object copy(Object obj) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { // 获得对象的类型 Class classType = obj.getClass(); System.out.println("该对象的类型是:" + classType.toString()); // 通过默认构造方法去创建一个新的对象,getConstructor的视其参数决定调用哪个构造方法 Object objectCopy = classType.getConstructor(new Class[] {}) .newInstance(new Object[] {}); // 获得对象的所有属性 Field[] fields = classType.getDeclaredFields(); // System.out.println("公有属性:"+classType.getFields()[0]); for (int i = 0; i < fields.length; i++) { // 获取数组中对应的属性 Field field = fields[i]; String fieldName = field.getName(); String stringLetter = fieldName.substring(0, 1).toUpperCase(); // 获得相应属性的getXXX和setXXX方法名称 String getName = "get" + stringLetter + fieldName.substring(1); String setName = "set" + stringLetter + fieldName.substring(1); // 获取相应的方法 Method getMethod = classType.getMethod(getName, new Class[] {}); Method setMethod = classType.getMethod(setName, new Class[] { field.getType() }); // 调用源对象的getXXX()方法 Object value = getMethod.invoke(obj, new Object[] {}); System.out.println(fieldName + " :" + value); // 调用拷贝对象的setXXX()方法 setMethod.invoke(objectCopy, new Object[] { value }); System.out.println("调用拷贝对象的get方法:" + fieldName + " :" + getMethod.invoke(objectCopy, new Object[] {})); } Method[] m = classType.getMethods(); for (int i = 0; i < m.length; i++) { // 输出方法的返回类型 System.out.print(m[i].getReturnType().getName()); // 输出方法名 System.out.print(" " + m[i].getName() + "("); // 获取方法的参数 Class[] parameterTypes = m[i].getParameterTypes(); for (int j = 0; j < parameterTypes.length; j++) { System.out.print(parameterTypes[j].getName()); if (parameterTypes.length > j + 1) { System.out.print(","); } } System.out.println(")"); } return objectCopy; } public static void main(String[] args) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { Customer customer = new Customer(); customer.setName("hejianjie"); customer.setId(new Long(1234)); customer.setAge(19); Customer customer2 = null; customer2 = (Customer) new ReflectTester().copy(customer); System.out.println(customer.getName() + " " + customer2.getAge() + " " + customer2.getId()); System.out.println(customer); System.out.println(customer2); } }
?
Customer类
package example1; public class Customer { public String test; public String getTest() { return test; } public void setTest(String test) { this.test = test; } private Long id; private String name; private int age; public Customer(){ } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
?利用反射创建数组
package example2; import java.lang.reflect.Array; public class ArrayTester1 { /** * 此类根据反射来创建 <br/> * 一个动态的数组 */ public static void main(String[] args) throws ClassNotFoundException { Class classType = Class.forName("java.lang.String"); Object array = Array.newInstance(classType, 10); // 指定数组的类型和大小 // 对索引为5的位置进行赋值 Array.set(array, 5, "hello"); String s = (String) Array.get(array, 5); System.out.println(s); // 循环遍历这个动态数组 for (int i = 0; i < ((String[]) array).length; i++) { String str = (String) Array.get(array, i); System.out.println(str); } } }
?