Java反射4

来源:互联网 发布:手机通话记录软件 编辑:程序博客网 时间:2024/06/06 10:57

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不需要参数和自变量,首先调用ClassgetField()并指定field名称,获得特定的Field对象后便可以直接调用Field getObject 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[]{}作为getMethodString nameClass[])方法的参数类型,接下来准备一个Obeject[]放置自变量,然后调用Method对象的invokeObject objObject[])方法。

注意,在这里调用

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

       }

 

原创粉丝点击