JAVA强大的基础功能JavaReflection
来源:优易学  2011-4-28 17:08:23   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  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);
  }
  }
  }
  根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。
  8.改变字段(域)的值
  reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它,下面的例子可以说明这一点:
  import java.lang.reflect.*;
  public class field2 {
  public double d;
  public static void main(String args[]) {
  try {
  Class cls = Class.forName("field2");
  Field fld = cls.getField("d");
  field2 f2obj = new field2();
  System.out.println("d = " + f2obj.d);
  fld.setDouble(f2obj, 12.34);
  System.out.println("d = " + f2obj.d);
  } catch (Throwable e) {
  System.err.println(e);
  }
  }
  }
  这个例子中,字段 d 的值被变为了 12.34。
  9.使用数组
  本文介绍的 reflection 的最后一种用法是创建的操作数组。数组在 Java 语言中是一种特殊的类类型,一个数组的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的:
  import java.lang.reflect.*;
  public class array1 {
  public static void main(String args[]) {
  try {
  Class cls = Class.forName("java.lang.String");
  Object arr = Array.newInstance(cls, 10);
  Array.set(arr, 5, "this is a test");
  String s = (String) Array.get(arr, 5);
  System.out.println(s);
  } catch (Throwable e) {
  System.err.println(e);
  }
  }
  }
  例中创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋了值,最后将这个字符串从数组中取得并打印了出来。
  下面这段代码提供了一个更复杂的例子:
  import java.lang.reflect.*;
  public class array2 {
  public static void main(String args[]) {
  int dims[] = new int[]{5, 10, 15};
  Object arr = Array.newInstance(Integer.TYPE, dims);
  Object arrobj = Array.get(arr, 3);
  Class cls = arrobj.getClass().getComponentType();
  System.out.println(cls);
  arrobj = Array.get(arrobj, 5);
  Array.setInt(arrobj, 10, 37);
  int arrcast[][][] = (int[][][]) arr;
  System.out.println(arrcast[3][5][10]);
  }
  }
  例中创建了一个 5 x 10 x 15 的整型数组,并为处于 [3][5][10] 的元素赋了值为 37。注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。
  注意创建数组时的类型是动态的,在编译时并不知道其类型。

上一页  [1] [2] [3] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训