Java基礎--反射

1, 反射:就是把java類中各種成分映射成相應的java類。

字節碼:字節碼通常指的是已經經過編譯,但與特定機器碼無關,需要直譯器轉譯後才能成爲機器碼的中間代碼。編譯器將源碼編譯成字節碼,特定平臺上的虛擬機器將字節碼轉譯爲可以直接執行的指令。
要學的方法,Class,Field,Method, Constructor, Package。。。
Method代表一個類中方法的類型,
Class是一個類,Class類代表java類。
沒有構造方法,不能new對象。
Class cls1 = 字節碼1;
Class cls2 = Date.class;

Person p1;
p1.getClass();//得到字節碼
Class.forName("java.lang.String");//返回字節碼

三種方式獲得字節碼:
1,類名.class,如System.class
2,對象.getClass(),如new Date().getClass();
3,Class.forName("類名"),如 Class.forName("java.util.Date");
通常用第三種,源程序不需要知道類名,運行時傳入參數獲取。

九個預定義的.class,包括八種基本數據類型和void類型。
String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = Stirng.class();
Class cls3 = Class.forName("java.lang.String");

這三個是同一份字節碼。 

isPrimitive()判斷是否是基本類型,
cls1.isPrimitive();
九種預定義Class實例對象,int.class == Integer.Type
數組類型的Class實例對象,Class.isArray()

總之,只要在源程序中出現的類型,都有各自的Class實例對象,如int[]

2,反射用的方法

獲取類的構造方法:
Constructor類,代表某個類中的一個構造方法。
Constructor[] constructors = Class.forName("java.lang.String").getConstuctor()
Ex. 
Constructor cons1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)cons1.newInstance(new StringBuffer("abc"));

ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldy = pt1.getClass().getField("y");
Fieldy.get(pt1);//這樣取出的就是pt1中的參數5.
對於private變量可用getDeclaredField("x");
取出用fieldx.setAccessible(true);然後再取。

同一份字節碼的比較用==比。(field.getType() == String.class())

Method:方法的反射。
Method methodCharAt = String.class.getMethod("charAt", int.class);
methodCharAt.invoke(str, 1);如果此處str爲null,那麼調用的是靜態方法。

數組的反射,
具有相同維數和元素類型的數組屬於同一類型
反射的應用,寫框架。

應用的例子,主體部分
    Properties props = new Properties();  
        InputStream ips = new FileInputStream("config.properties");

        props.load(ips);  
        ips.close();  

        String className = props.getProperty("className");  
        Collection collections = (Collection)Class.forName(className).newInstance();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章