服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用java5特性来简化反射编程

     感谢引入var-args和auto-boxing,java5彻底的简化了我们对反射的使用。关于var-args的一个有趣的事是:好像没有平台通知我们说,var-args现在是可用的。当然,有一些ide在pop-up或其他的地方用object...表识取代了object[]标识。

     但是如果你没有注意到的话,那么这对你是不公平的。看看下面的代码吧,你就会知道我为什么这么说。

package org.javalobby.tnt.vararg;

import java.lang.reflect.method;

public class testreflectionexample {

public static void main(string[] args) throws exception {
  string s = "test string";
  prejava5(s);
  postjava5(s);
}

private static void prejava5(string s) throws exception {
  // first, do a substring
  class c = s.getclass();
  method m = c.getmethod("substring", new class[] { int.class, int.class });
  object obj = m.invoke(s, new object[] { new integer(0), new integer(4) });
  system.out.println(obj);
  
  // next, do a 'length'
  method m2 = c.getmethod("length", null);
  integer lengthobj = (integer)m2.invoke(s, null);
  int length = lengthobj.intvalue();
  system.out.println(length);
}

private static void postjava5(string s) throws exception {
  // first, do a substring
  class<?> c = s.getclass();
  method m = c.getmethod("substring", int.class, int.class);
  object obj = m.invoke(s, 0, 4);
  system.out.println(obj);

// next, do a 'length'
  method m2 = c.getmethod("length");
  int length = (integer)m2.invoke(s);
  system.out.println(length);
  
 }

}  

   上面的两段代码都做相同的事情,但是通过使用var-args和auto-boxing的力量,方法的调用变得非常简单。例如:

// pre java 5
object obj = m.invoke(s, new object[] { new integer(0), new integer(4) });
// post java 5 - var-args + autoboxing.
object obj = m.invoke(s, 0, 4);

译者加注:var-args使得pose java 5的代码由数组类型的一个参数, 如:

   new object[] { new integer(0), new integer(4) }

简化成了两个参数,new integer(0)和new integer(4) ;
而auto-boxing使得new integer(0)和new integer(4)简化成了0和4。  

下面是另外一个例子:

// pre java-5
method m2 = c.getmethod("length", null);
integer lengthobj = (integer)m2.invoke(s, null);
// post java-5. inferred var-args (no arguments) and auto-unboxing.
method m2 = c.getmethod("length");
int length = (integer)m2.invoke(s);

译者加注:var-args使得pose java 5的代码由两个必须的参数,简化成一个,如从"length", null简化成了"length";
而auto-boxing使得(integer)m2.invoke(s)的一个整型对象能直接赋值给一个int型的 变量,length 。

运行结果:
c:/java>java testreflectionexample
test
11
test
11

扫描关注微信公众号