java特性之反射
阿新 • • 發佈:2018-12-13
反射的定義
允許程式在執行時進行自我檢查,同時允許在執行時對內部成員進行操作
反射的核心是JVM在執行時才動態載入類或呼叫方法/訪問屬性,它不需要事先(寫程式碼的時候或編譯期)知道執行物件是誰。
Java反射框架主要提供以下功能:
- 在執行時判斷任意一個物件所屬的類;
- 在執行時構造任意一個類的物件;
- 在執行時判斷任意一個類所具有的成員變數和方法(通過反射甚至可以呼叫private方法);
- 在執行時呼叫任意一個物件的方法
反射的用途
主要用途 :
1、反射最重要的用途就是開發各種通用框架。
三、基本反射功能的實現(反射相關的類一般都在java.lang.relfect包裡):
1、獲得Class物件
使用Class類的forName靜態方法
直接獲取某一個物件的class
呼叫某個物件的getClass()方法
2、判斷是否為某個類的例項
用instanceof關鍵字來判斷是否為某個類的例項
3、建立例項
使用Class物件的newInstance()方法來建立Class物件對應類的例項。
先通過Class物件獲取指定的Constructor物件,再呼叫Constructor物件的newInstance()方法來建立例項。
4、獲取方法
getDeclaredMethods()
5、獲取構造器資訊
getDeclaredMethods() getMethods() getMethod()
6、獲取類的成員變數(欄位)資訊
getFiled: 訪問公有的成員變數
getDeclaredField:所有已宣告的成員變數。但不能得到其父類的成員變數
getFileds和getDeclaredFields用法
7、呼叫方法
invoke()
8、利用反射建立陣列
Array.newInstance()
每一個類和例項物件都有自己的class怎麼獲取class物件。 1.如果是一個包裝類可以通過.TYPE獲取; 2.如果是一個類可以通過.class屬性獲取; 3.如果是一個類的例項物件可以.getClass()方法獲取;
程式碼實現
//第一步:載入類,返回class物件 任何一個類都有自己的class物件 Class class1= Class.forName("com.chenghui.entity.Person"); //作用1 :例項化 Constructor c =class1.getConstructor(String.class,int.class,int.class,String.class); //呼叫有引數的構造方法 Object obj=c.newInstance("chenghui",1,1,"123123"); //呼叫無參的構造方法,動態建立該類例項 //作用2 : 獲取屬性 //Object obj = class1.newInstance(); //獲取該類的所有共有屬性 Field[]fields = class1.getFields(); //獲取該類的所有屬性 Field[]declaredFields = class1.getDeclaredFields(); //作用3: 獲取方法(包括私有方法) //獲取該類的所有方法 Method[]methods = class1.getMethods(); for(Field field :declaredFields){ System.out.println(field); if(field.getName().equals("sex") ){ //是否允許為私有屬性賦值 field.setAccessible(true); field.set(obj,"男"); } } //作用4: 呼叫方法 for(Method method :methods){ System.out.println(method); if(method.getName().equals("show")){ method.invoke(obj);//呼叫 } }
反射的好處: 1.程式靈活
反射的缺點: 由於反射會額外消耗一定的系統資源,因此如果不需要動態地建立一個物件,那麼就不需要用反射。 另外,反射呼叫方法時可以忽略許可權檢查,因此可能會破壞封裝性而導致安全問題。