JAVA 反射

反射:

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

相關文章
相關標籤/搜索