龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

JAVA反射机制实例教程(2)

时间:2014-09-20 11:08来源:网络整理 作者:网络 点击:
分享到:
这个程序首先取得 method1 类的描述,然后调用 getDeclaredMethods 来获取一系列的 Method 对象,它们分别描述了定义在类中的每一个方法,包括 public 方法、pr

这个程序首先取得 method1 类的描述,然后调用 getDeclaredMethods 来获取一系列的 Method 对象,它们分别描述了定义在类中的每一个方法,包括 public 方法、protected 方法、package 方法和 private 方法等。如果你在程序中使用 getMethods 来代替 getDeclaredMethods,你还能获得继承来的各个方法的信息。

取得了 Method 对象列表之后,要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型,都可以由描述类的对象按顺序给出。

输出的结果如下:

name = f1 
decl class = class method1 
param #0 class java.lang.Object 
param #1 int 
exc #0 class java.lang.NullPointerException 
return type = int
-----
name = main 
decl class = class method1 
param #0 class [Ljava.lang.String; 
return type = void

4.获取构造器信息

获取类构造器的用法与上述获取方法的用法类似,如:

import java.lang.reflect.*;
public class Constructor1 { 
  public Constructor1() { 
  } 
  protected Constructor1(int i, double d) { 
  } 
  public static void main(String args[]) { 
   try { 
      Class cls = Class.forName("Constructor1"); 
      Constructor ctorlist[] = cls.getDeclaredConstructors(); 
      for (int i = 0; i < ctorlist.length; i++) { 
       Constructor ct = ctorlist[i]; 
       System.out.println("name = " + ct.getName()); 
       System.out.println("decl class = " + ct.getDeclaringClass()); 
       Class pvec[] = ct.getParameterTypes(); 
       for (int j = 0; j < pvec.length; j++) 
         System.out.println("param #" + j + " " + pvec[j]); 
       Class evec[] = ct.getExceptionTypes(); 
       for (int j = 0; j < evec.length; j++) 
         System.out.println("exc #" + j + " " + evec[j]); 
       System.out.println("-----"); 
      } 
   } 
   catch (Throwable e) { 
      System.err.println(e); 
   } 
  } 
}

这个例子中没能获得返回类型的相关信息,那是因为构造器没有返回类型。

这个程序运行的结果是:

name = Constructor1
decl class = class Constructor1
param #0 int
param #1 double
-----
name = Constructor1
decl class = class Constructor1
-----

5.获取类的字段(域)

找出一个类中定义了哪些数据字段也是可能的,下面的代码就在干这个事情:

import java.lang.reflect.*; 
public class Field1 { 
  private double d; 
  public static final int i = 37; 
  String s = "testing"; 
  public static void main(String args[]) { 
   try { 
      Class cls = Class.forName("Field1"); 
      Field fieldlist[] = cls.getDeclaredFields(); 
      for (int i = 0; i < fieldlist.length; i++) { 
       Field fld = fieldlist[i]; 
       System.out.println("name = " + fld.getName()); 
       System.out.println("decl class = " + fld.getDeclaringClass()); 
       System.out.println("type = " + fld.getType()); 
       int mod = fld.getModifiers(); 
       System.out.println("modifiers = " + Modifier.toString(mod)); 
       System.out.println("-----"); 
      } 
   } 
   catch (Throwable e) { 
      System.err.println(e); 
   } 
  } 
}

这个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier,它也是一个 reflection 类,用来描述字段成员的修饰语,如“private int”。这些修饰语自身由整数描述,而且使用 Modifier.toString 来返回以“官方”顺序排列的字符串描述 (如“static”在“final”之前)。这个程序的输出是:

name = d
decl class = class Field1
type = double
modifiers = private
-----
name = i
decl class = class Field1
type = int
modifiers = public static final
-----
name = s
decl class = class Field1
type = class java.lang.String
modifiers = 
-----

和获取方法的情况一下,获取字段的时候也可以只取得在当前类中申明了的字段信息 (getDeclaredFields),或者也可以取得父类中定义的字段 (getFields) 。

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

精彩图集

赞助商链接