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程序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爲方法參數