反射

reflect機制:在運行狀態時 對任一類(通過class對象)都可以知道里面的類的屬性和方法.

獲取class對象的三種方式:

1.通過new實例化對象然後調Object的getClass()方法

User a=new User();
Class c1=a.getClass();
2.通過類的Qualified Name 然後調用Class.forName();---->一般都用這種方法
String className="com.fitch.reflect.User";
Class c2=Class.forName(className);
3.任何數據類型都有一個靜態屬性.class .
 Class c3=int.class;
 c3=double[].class;
 c3=User.class;
如果要看class文件 可以在你的項目裏的.classpath文件裏有顯示對象存放的目錄,然後根據class path entry kind="output"節點裏的路徑來找到.class文件.
 

new實例化對象時,會根據new的類的名稱找尋該類的字節碼文件(.class)(java虛擬機來識別立馬的字節碼). 並加載進入內存 然後創建該類的字節碼對象(Class對象) 並接着創建該字節碼文件中對應的對象實例

創建對象:(雖然new實例化比較簡潔 但是下面這種方法擴展性較強)

1.創建字節碼對象:(還沒有實例化)

String className="com.fitch.reflect.User";
Class c2=Class.forName(className);
2.實例化
Object obj=c2.newInstance();--->默認調用類的無參構造器
若要 指定構造函數來實例化 則先獲取Class對象的構造器對象Constrctor 然後利用構造器對象.newInstance(參數)

 Constructor<User> con=c2.getConstructor(String.class,int.class);
     User user=con.newInstance("小米",22);
利用Class對象獲取字段或方法
字段:
 Field name=c2.getField("name");//獲取可以訪問的字段 私有字段不可訪問
Field age=c2.getDeclaredField("age");//獲取所有字段 包括私有
雖然可以獲取到私有的 不能用 否則報錯illegalAccessException. 反射機制默認行爲受限於java訪問控制,然而 如果一個java程序
沒有受到安全管理器的控制 就可以覆蓋訪問控制.爲了達到這個目的 需調用Field,Method 或Constructor對象的setAccessible
方法.
age.setAccessible(true);
然後可以調用
  Object a=age.get(user);//獲取user實例中的age值
age.set(user, 33);//給字段賦值
方法method:
 Method[] methods=c2.getMethods();//獲取公共方法
     methods=c2.getDeclaredMethods();//所有方法
     Method method=c2.getMethod("show", String.class);//show方法名 後面的是參數.如果沒有參數 則爲null
     method.invoke(user, "dd");//user實例 dd爲方法參數
















發佈了53 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章