Java 反射機制

反射(Reflection)是java語言的一個特性,它允程序在運行時來進行自我檢查并且對內部的成員進行操作。一個常見的例子是在JavaBean中,一些組件可以通過一個構造器來操作。這個構造器就是用的反射在動態加載的時候來獲取的java中類的屬性的。

反射相關的包

java.lang.reflect
java.lang.Class(反射的開始)

通過反射了解類

給定一個類或者對象,通過反射機制可以動態的
了解類的屬性,方法,構造函數
創建對象
調用方法
改寫屬性

應用場景

運行時,動態的情況下應對外面傳入的類名,對象實例等
只知道類名字符串
通常應用到框架中

反射的開始:類類型 Class Class

java中有一個類很特殊,就是Class類,這個類是有JVM來創建的,所以我們就不用麻煩了。如果我們拿到一個類的類型信息,就可以利用反射獲取其各種成員以及方法了。
在沒有對象實例的時候,主要有三種辦法。

System.out.println("Method 1:"); //通過一個實例來獲得
class Class dog=new Dog().getClass(); 
System.out.println(dog.getName()); 

System.out.println("Method 2:"); //通過className來獲得 
Class c=Class.forName(className); 

System.out.println("Method 3:"); //通過已知的類獲取class 
Class b=Dog.class; 

注意:第二種方式中,forName中的參數一定是完整的類名(包名+類名),并且這個方法需要捕獲異常。
現在得到Class就可以創建一個對象的實例了,利用Class的newInstance方法相當于調用類的默認的構造器。

//方法一 :調用類的空構造方法
Object o=dogClazz.newInstance(); 
System.out.println("創建的對象是:");
System.out.println(o); 
//方法二 :使用有參數的構造方法:Constructor類,這個類用來封裝反射得到的構造器
Constructor c=dogClazz.getConstructor(new Class[]{String.class,int.class});
Object o2=c.newInstance("大黃",5);
獲取類的成員變量

成員變量用Field類進行封裝,主要的方法非常的類似:
public [Field] getDeclaredField([String]) 獲取任意指定名字的成員
public [Field][] getDeclaredFields() 獲取所有的成員變量
public [Field] getField([String] name) 獲取任意public成員變量
public [Field][] getFields() 獲取所有的public成員變量

注意,以上的四個方法全部需要拋出異常,當我們獲得私有的方法的時候,要用setAccessible設置一下可訪問的權限。

Object o = dogClazz.newInstance();
System.out.println("通過空的構造函數創建的對象是"+ o);
Field[] fields=dogClazz.getFields();
for(Field f:fields){
      System.out.println(f.getName());          
}
Field f = dogClazz.getField("name");
f.set(o, "hisdog");
f.get(o);

獲取類的方法

封裝類的方法的類是Method.獲取method也有四個方法
public [Method][] getMethods() 獲取所有的共有方法的集合
**public [Method] getMethod([String] name,[Class]<?>... parameterTypes) 獲取指定公有方法 參數1:方法名 參數2:參數類型集合 **
public [Method][] getDeclaredMethods() 獲取所有的方法
public [Method] getDeclaredMethod([String] name,[Class]<?>... parameterTypes) 獲取任意指定方法

Object o = dogClazz.newInstance();
System.out.println("通過空的構造函數創建的對象是"+ o);
Method m=dogClazz.getMethod("bark", new Class[]{});
m.invoke(o, new Object[]{});

注意:在獲取類和成員變量時若含有Declared的方法,是獲得自定義的目標

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容