技术开发 频道

实例讲解:java reflection 发射机制

  6.根据方法的名称来执行方法

  文本到这里,所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection 来做一些其它的事情,比如执行一个指定了名称的方法。下面的示例演示了这一操作:

  import java.lang.reflect.*;
  
public class method2 {
  
public int add(int a, int b) {
  
return a + b;
  }
  
public static void main(String args[]) {
  
try {
  Class cls
= Class.forName("method2");
  Class partypes[]
= new Class[2];
  partypes[
0] = Integer.TYPE;
  partypes[
1] = Integer.TYPE;
  Method meth
= cls.getMethod("add", partypes);
  method2 methobj
= new method2();
  Object arglist[]
= new Object[2];
  arglist[
0] = new Integer(37);
  arglist[
1] = new Integer(47);
  Object retobj
= meth.invoke(methobj, arglist);
  Integer retval
= (Integer) retobj;
  System.out.println(retval.intValue());
  }
catch (Throwable e) {
  System.err.println(e);
  }
  }
  }

  假如一个程序在执行的某处的时候才知道需要执行某个方法,这个方法的名称是在程序的运行过程中指定的 (例如,JavaBean 开发环境中就会做这样的事),那么上面的程序演示了如何做到。

  上例中,getMethod 用于查找一个具有两个整型参数且名为 add 的方法。找到该方法并创建了相应的 Method 对象之后,在正确的对象实例中执行它。执行该方法的时候,需要提供一个参数列表,这在上例中是分别包装了整数 37 和 47 的两个 Integer 对象。执行方法的返回的同样是一个 Integer 对象,它封装了返回值 84。

  7.创建新的对象

  对于构造器,则不能像执行方法那样进行,因为执行一个构造器就意味着创建了一个新的对象 (准确的说,创建一个对象的过程包括分配内存和构造对象)。所以,与上例最相似的例子如下:

  import java.lang.reflect.*;
  
public class constructor2 {
  
public constructor2() {
  }
  
public constructor2(int a, int b) {
  System.out.println(
"a = " + a + " b = " + b);
  }
  
public static void main(String args[]) {
  
try {
  Class cls
= Class.forName("constructor2");
  Class partypes[]
= new Class[2];
  partypes[
0] = Integer.TYPE;
  partypes[
1] = Integer.TYPE;
  Constructor ct
= cls.getConstructor(partypes);
  Object arglist[]
= new Object[2];
  arglist[
0] = new Integer(37);
  arglist[
1] = new Integer(47);
  Object retobj
= ct.newInstance(arglist);
  }
catch (Throwable e) {
  System.err.println(e);
  }
  }
  }

  根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。

0
相关文章