感谢引入varargs和autoboxingJava彻底的简化了我们对反射的使用关于varargs的一个有趣的事是好像没有平台通知我们说varargs现在是可用的当然有一些IDE在popup或其他的地方用Object表识取代了Object[]标识
但是如果你没有注意到的话那么这对你是不公平的看看下面的代码吧你就会知道我为什么这么说
package orgjavalobbytntvararg;
import javalangreflectMethod;
public class TestReflectionExample {
public static void main(String[] args) throws Exception {
String s = Test String;
preJava(s);
postJava(s);
}
private static void preJava(String s) throws Exception {
// First do a substring
Class c = sgetClass();
Method m = cgetMethod(substring new Class[] { intclass intclass });
Object obj = minvoke(s new Object[] { new Integer() new Integer() });
Systemoutprintln(obj);
// Next do a length
Method m = cgetMethod(length null);
Integer lengthObj = (Integer)minvoke(s null);
int length = lengthObjintValue();
Systemoutprintln(length);
}
private static void postJava(String s) throws Exception {
// First do a substring
Class<?> c = sgetClass();
Method m = cgetMethod(substring intclass intclass);
Object obj = minvoke(s );
Systemoutprintln(obj);
// Next
do a
length
Method m = cgetMethod(length);
int length = (Integer)minvoke(s);
Systemoutprintln(length);
}
}
上面的两段代码都做相同的事情但是通过使用varargs和autoboxing的力量方法的调用变得非常简单例如
// Pre Java
Object obj = minvoke(s new Object[] { new Integer() new Integer() });
// Post Java Varargs + Autoboxing
Object obj = minvoke(s );
译者加注varargs使得Pose Java 的代码由数组类型的一个参数 如:
new Object[] { new Integer() new Integer() }
简化成了两个参数new Integer()和new Integer()
而autoboxing使得new Integer()和new Integer()简化成了和
下面是另外一个例子
// Pre Java
Method m = cgetMethod(length null);
Integer lengthObj = (Integer)minvoke(s null);
// Post Java Inferred varargs (no arguments) and autounboxing
Method m = cgetMethod(length);
int length = (Integer)minvoke(s);
译者加注varargs使得Pose Java 的代码由两个必须的参数简化成一个如从length null简化成了length
而autoboxing使得(Integer)minvoke(s)的一个整型对象能直接赋值给一个int型的 变量length
运行结果
C:\java>java TestReflectionExample
Test
Test