感謝引入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
= c
getMethod(
length
);
int length = (Integer)m
invoke(s);
System
out
println(length);
}
}
上面的兩段代碼都做相同的事情
但是通過使用var
args和auto
boxing的力量
方法的調用變得非常簡單
例如
// Pre Java
Object obj = m
invoke(s
new Object[] { new Integer(
)
new Integer(
) });
// Post Java
Var
args + Autoboxing
Object obj = m
invoke(s
);
譯者加注
var
args使得Pose Java
的代碼由數組類型的一個參數
如:
new Object[] { new Integer(
)
new Integer(
) }
簡化成了兩個參數
new Integer(
)和new Integer(
)
而auto
boxing使得new Integer(
)和new Integer(
)簡化成了
和
下面是另外一個例子
// Pre Java
Method m
= c
getMethod(
length
null);
Integer lengthObj = (Integer)m
invoke(s
null);
// Post Java
Inferred var
args (no arguments) and auto
unboxing
Method m
= c
getMethod(
length
);
int length = (Integer)m
invoke(s);
譯者加注
var
args使得Pose Java
的代碼由兩個必須的參數
簡化成一個
如從
length
null簡化成了
length
而auto
boxing使得(Integer)m
invoke(s)的一個整型對象能直接賦值給一個int型的 變量
length
運行結果
C:\java>java TestReflectionExample
Test
Test
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26813.html