1. 程式人生 > >java特性之反射

java特性之反射

反射的定義

允許程式執行時進行自我檢查,同時允許在執行時對內部成員進行操作

反射的核心是JVM在執行時才動態載入類或呼叫方法/訪問屬性,它不需要事先(寫程式碼的時候或編譯期)知道執行物件是誰。

Java反射框架主要提供以下功能:

  1. 在執行時判斷任意一個物件所屬的類;
  2. 在執行時構造任意一個類的物件;
  3. 在執行時判斷任意一個類所具有的成員變數和方法(通過反射甚至可以呼叫private方法);
  4. 在執行時呼叫任意一個物件的方法

反射的用途

主要用途 :

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.程式靈活

反射的缺點: 由於反射會額外消耗一定的系統資源,因此如果不需要動態地建立一個物件,那麼就不需要用反射。 另外,反射呼叫方法時可以忽略許可權檢查,因此可能會破壞封裝性而導致安全問題。