Java反射测验代码

Java代码
  package reflect;
  import java.lang.reflect.*;
  public class DumpMethods {
  private double d;
  public static final int i = 37;
  String s = "testing";
  public DumpMethods() {
  }
  protected DumpMethods(int i, double d) {
  }
  public int add(int a, int b) {
  return a + b;
  }
  public static void main(String args) {
  try {
  Class c = Class.forName("java.lang.String");
  // 得到指定类java.lang.String拥有的方法,将它们分别列出来。
  Method m = c.getDeclaredMethods();
  for (int i = 0; i m.length; i++) {
  Method mthod = m[i];
  System.out.println(mthod.getName());// 打印方法名
  System.out.println(mthod.getDeclaringClass());// 打印方法名
  // ...得到参数类型
  Class pvec = mthod.getParameterTypes();
  for (int j = 0; j pvec.length; j++)
  System.out.println("param #" + j + " " + pvec[j]);
  // ...得到异常类型
  Class evec = mthod.getExceptionTypes();
  for (int j = 0; j evec.length; j++)
  System.out.println("exc #" + j + " " + evec[j]);
  // ...得到返回类型
  System.out.println("return type = " + mthod.getReturnType());
  System.out.println("-");
  // ...System.out.println(m[i].toString());//打印方法名
  }
  // 获得指定类java.lang.String的构造方法,将它们分别列出来。
  Constructor ctorlist = c.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("-");
  }
  // 获取当前类中声明的字段(不包括从基类继承来的字段),若替换成c.getFields,则是获得包括从基类继承的所有字段
  Field fieldlist = c.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("-");
  }
  // 根据方法的名称来执行方法
  Class partypes = new Class;
  partypes[0] = Integer.TYPE;
  partypes = Integer.TYPE;
  Method meth = c.getMethod("add", partypes);
  // ...实例化
  DumpMethods methobj = new DumpMethods();
  Object arglist = new Object;
  arglist[0] = new Integer(37);
  arglist = new Integer(47);
  Object retobj = meth.invoke(methobj, arglist);
  Integer retval = (Integer) retobj;
  // ...这里应当返回add方法的结果
  System.out.println(retval.intValue());
  /*
  * 通过调用构造方法来创建新的对象 根据指定的参数类型找到相应的构造函数并执行它,以创建一个新的对象实例。
  * 使用这种方法可以在程序运行时动态地创建对象,而不是在编译的时候创建对象,这一点非常有价值。
  */
  Constructor ct = c.getConstructor(partypes);
  Object retobj1 = ct.newInstance(arglist);
  // 改变字段(域)的值
  Field fld = c.getField("d");
  DumpMethods f2obj = new DumpMethods();
  System.out.println("d = " + f2obj.d);
  // ...改变值 除了setDouble还有其他很多种
  fld.setDouble(f2obj, 12.34);
  System.out.println("d = " + f2obj.d);
  // 使用数组,创建了 10 个单位长度的 String 数组,为第 5 个位置的字符串赋值
  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);
  // 数组的另一个复杂点的例子
  /*
  * 例中创建了一个 5 x 10 x 15 的整型数组,并为处于的元素赋了值为 37。
  * 注意,多维数组实际上就是数组的数组,例如,第一个 Array.get 之后,arrobj 是一个 10 x 15 的数组。
  * 进而取得其中的一个元素,即长度为 15 的数组,并使用 Array.setInt 为它的第 10 个元素赋值。
  * 注意创建数组时的类型是动态的,在编译时并不知道其类型。
  */
  int dims = new int { 5, 10, 15 };
  Object arr1 = Array.newInstance(Integer.TYPE, dims);
  Object arrobj = Array.get(arr1, 3);
  Class cls1 = arrobj.getClass().getComponentType();
  System.out.println(cls1);
  arrobj = Array.get(arrobj, 5);
  Array.setInt(arrobj, 10, 37);
  int arrcast = (int) arr;
  System.out.println(arrcast);
  } catch (Throwable e) {
  System.err.println(e);
  }
  }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值