反射



反射技術.  由這項技術獲取指定名稱的類,並建立該類的對象。 提高了程序的擴展性。
反射技術:動態的獲取類以及類中的成員,並可以調用該類成員,
        以前 是有什麼類,就new 什麼類,  現在是,沒有類,給什麼類就new什麼對象

 無論new 什麼對象,都需要先獲取字節碼文件。
 如何獲取呢? 發現java已對字節碼文件進行了描述用的class類完成的

如何獲取一個字節碼文件的對象?

 方式一: Object getClass(); 方法。 不適合,因爲 反射技術不明確具體類
方式二: 所有的數據類型都有自己對應的Class對象,表示方式很簡單。
      每一個數據類型都有一個默認的靜態的屬性。 .Class,用該屬性就可以獲取到字節碼文件對象。

方式三: 在class類中的找到了forName方法。通過名稱就可以獲取對應的字節碼文件對象。

獲取指定的age字段。
 String  className ="cn.itcast.domain.Person";
  Class clazz = Class.forName(className);
  Object obj = clazz.getField("age");// 該方法只獲取公有的
  Field field = clazz.getDeclaredField("age");// 全部獲取

要對非靜態的字段操作必須有對象。
  Object obj = clazz.newInstance();

 //使用父類的方法將訪問權限檢查能力取消
  field.setAccessible(true); // 暴力訪問
  field.set(obj,40);
  System.out.println(field.get(obj));

動態獲取方法:

 // 反射方法,非靜態,有參數的paramShow方法。
 Method method = clazz.getMethod("paramShow",String.class,int.class);
 Object obj = clazz.newInstance();
 method.invoke(obj,"xiaoqiang",40);

// 反射方法,靜態,無參數的staticShow方法
 Method method = clazz.getMethod("staticShow",null);
 method.invoke(null,null);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章