首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java 反照机制一

2012-12-20 
java 反射机制一Java类反射中所必须的类: ????? Java的类反射所需要的类并不多,它们分别是:Field、Construc

java 反射机制一

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);}}}

更多参考开心购的交流专区

热点排行