反射:
Class c = Class.forName ("java.lang.Integer");
這條語句獲得一個 Integer類的類對象。還有另外一種方法,以下面的語句:
Class c = Integer.class;
或者
Class c = Integer.TYPE;
它們可得到基本類型的類信息。其中後一種方法中訪問的是基本類型的封裝類 (如 Integer) 中預先定義好的 TYPE 字段。
第二步是調用諸如 getDeclaredMethods 的方法,以取得該類中定義的全部方法的列表。
一旦取得這個信息,就能夠進行第三步了。
第三步是使用 reflection API 來操做這些信息,以下面這段代碼:
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
它將以文本方式打印出 String 中定義的第一個方法的原型。
反射常常由框架型代碼使用,因爲這一點,咱們可能但願框架可以全面接入代碼,無需考慮常規的接入限制。例如當代碼在不值得信任的代碼共享的環境中運行時。
假設有如下這個類的聲明:
class DemoReflection
{
private String name = null;
private void doPrint(String s) {
System.out.println("print....."+s);
}
};
能夠確定的是,這個類中的屬性name和方法doPrint都是沒法對外展現的,可是使用了反射之後就能夠辦到。
package com.glsc.xu.search;
import java.lang.reflect.Method;
public class TestReflection {
public static void main(String args[]) {
try {
// 經過反映射技術獲得DemoReflection的類型
Class cls = Class.forName("com.test.DemoReflection");
// 動態建立DemoReflection類的實力
Object instance = cls.newInstance();
// 經過反映射技術獲得DemoReflection的非公有方法doPrint
Method m = cls.getDeclaredMethod("doPrint",
new Class[] { String.class });
// 表示能夠隨意訪問該類中的方法
m.setAccessible(true);
// 調用doPrint方法
String s="hello world";
m.invoke(instance, new Object[] { s });
} catch (Exception ex) {
System.out.println(ex);
}
}
}
在該代碼中,讀者可能看到了一個比較陌生的方法setAccessible,這個方法很是重要,若是它不被設置成true那麼全部非公有方法仍然沒法調用,因此在調用非公有方法的時候須要注意這點。java