1.3. 反射机制的功能
JAVA反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
4.在运行时调用任意一个对象的方法(*****注意:前提都是在运行时,而不是在编译时)
1.3.1.在运行时判断任意一个对象所属的类
1.3.2.在运行时构造任意一个类的对象
想生成对象的实体,在反射动态机制中有两种方法,
一个针对无变量的构造方法,
一个针对带参数的构造方法,如果想调用带参数的构造方法,就比较的麻烦,不能直接调用Class类中的newInstance(),而是调用Constructor类中newInstance()方法,首先准备一个Class[]作为Constructor的参数类型。然后调用该Class对象的getConstructor()方法获得一个专属的Constructor的对象,最后再准备一个Object[]作为Constructor对象昂的newInstance()方法的实参。
在这里需要说明的是 只有两个类拥有newInstance()方法,分别是Class类和Constructor类,Class类中的newInstance()方法是不带参数的,而Constructro类中的newInstance()方法是带参数的,需要提供必要的参数。
例:
Class c=Class.forName("DynTest"); Class[] ptype=new Class[]{double.class,int.class}; Constructor ctor=c.getConstructor(ptypr); Object[] obj=new Object[]{new Double(3.1415),new Integer(123)}; Object object=ctor.newInstance(obj); System.out.println(object);
|
1.3.3.在运行时调用类所具有的成员变量和方法
变更Field不需要参数和自变量,首先调用Class的getField()并指定field名称,获得特定的Field对象后便可以直接调用Field的 get(Object obj)和set(Object obj,Object value)方法
或使用java.beans.PropertyDescriptor类,例如:
属性赋值:
private static void setPropertyValue (String name,String value,Object object) throws Exception{ PropertyDescriptor property = new PropertyDescriptor(name, object.getClass()); if (property != null){ property.getWriteMethod().invoke(object, new Object[]{value}); } } |
获取属性值:
private static Object getPropertyValue(String name,String value,Object object) throws Exception{ PropertyDescriptor property = new PropertyDescriptor(name, object.getClass()); Object value = property.getReadMethod().invoke(entity, new Object[0]); return vclaue; } |
1.3.4.在运行时调用任意一个对象的方法
这个动作首先准备一个Class[]{}作为getMethod(String name,Class[])方法的参数类型,接下来准备一个Obeject[]放置自变量,然后调用Method对象的invoke(Object obj,Object[])方法。
注意,在这里调用
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { Class ownerClass = owner.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(owner, args); } |