zoukankan      html  css  js  c++  java
  • 运行时生成instances+运行时调用methods+运行时变更fields内容

    想生成对象实体,在Reflection动态机制中有两种方法,一种是针对无参数的构造方法,另一个是针对带参数的构造方法。如果想调用的是带参数的构造方法就比较麻烦些,不能再调用Class的newInstance(),而是调用Constructor的newInstance()。首先准备一个Class【】作为Ctor的参数类型(本例中使用了一个double和一个int),获得以此为ctor实参值 ,调用上述专属ctor的newInstance()。

    example1:

      Class c=Class.forName("DynTest");//Dyntest是个类 有个不带参数的够着方法

      Objet obj=null;

      obj=c.newInstance();

      System.out.println(obj);

    example2:

      Class c=Class.forName("DynTest");

      Class[] pTypes=new Class[]{double.class,int.class};

      Construtor ctor=c.getConstrustor(pType);

      Object[] arg=new Object[]{3.14159,125};

      Object obj=ctor.newInstance(arg);

      System.out.println(obj);

    Part2----------------------运行时调用methods------------------------------------------------------------------------------

      这个动作和上述调用“无参数的ctor”相当类似。首先准备一个Class【】作为参数类型like(String,Hashtable),然后为此为自变量调用getMethod(),获得特定的Method object接下来准备一个Object【】 放置自变量,然后调用上述所得之特定Method object的invoke()。

    example:

    public String func(String s,Hashtable ht){

      system.out.println("func invokeed");

      return s;

    }

    public static void main(String[] args){

    Class c=Class.forName("Test");

    Class ptypes[]=new Class【2】;

    ptypes[0]=Class.forName("java.lang.String");

    ptypes[1]=Class.forName("java.util.Hashtable");

    Method m=c.getMethod("func",ptypes);

    Test obj=new Test();

    Object args[]=new Object[2];

    arg[0]=new String("Hello,World");

    arg[1]=null;

    Object r=m.invoke(obj,arg);

    Integer rval=(String)r;

    System.out.println(rval);

    }

    part3--------------------------------fields-------------------------------------

    example

    public class Test {

    public double d;

    public static void main(String[] args){

    Class f=Class.forName("Test");

    Field f=c.getField("d");

    Test obj=new Test();

    System.out.println("d="+(Double)f.get(obj);

    f.set(obj,12.4);

    System.out.println("d="+obj.d);

    }

    }

  • 相关阅读:
    linux开发中常用的命令及技巧(连载)
    使用CCS调试基于AM335X的SPL、Uboot(原创)
    [C语言]变量的声明和定义有什么区别
    C语言中void*详解及应用
    使用中断处理程序实现loop功能
    原码,反码,补码的深入理解与原理
    关于C和C++不同源文件中重名变量的问题(转)
    const extern static 终极指南(转)
    函数调用栈分析
    16位和32位的80X86汇编语言的区别(转)
  • 原文地址:https://www.cnblogs.com/feifeihu/p/2646200.html
Copyright © 2011-2022 走看看