首頁 > 軟體

Java反射機制詳解

2022-09-20 22:03:07

什麼是反射?

反射是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為 Java 語言的反射機制。

哪裡用到反射機制

JDBC中,利用反射動態載入了資料庫驅動程式。

Web伺服器中利用反射呼叫了Sevlet的服務方法。

Eclispe等開發工具利用反射動態刨析物件的型別與結構,動態提示物件的屬性和方法。

很多框架都用到反射機制,注入屬性,呼叫方法,如Spring。

動態代理是什麼

有哪些應用?

動態代理是執行時動態生成代理類。

動態代理的應用有 Spring AOP資料查詢、測試框架的後端 mock、rpc,Java註解物件獲取等。

怎麼實現動態代理

JDK 原生動態代理和 cglib 動態代理。

JDK 原生動態代理是基於介面實現的,而 cglib 是基於繼承當前類的子類實現的。

Java反射機制的作用

在執行時判斷任意一個物件所屬的類

在執行時構造任意一個類的物件

在執行時判斷任意一個類所具有的成員變數和方法

在執行時呼叫任意一個物件的方法

Java 反射機制的優缺點

優點:

  • 能夠執行時動態獲取類的範例,大大提高系統的靈活性和擴充套件性。
  • 與 Java 動態編譯相結合,可以實現無比強大的功能。
  • 對於 Java 這種先編譯再執行的語言,能夠讓我們很方便的建立靈活的程式碼,這些程式碼可以在執行時裝配,無需在元件之間進行原始碼的連結,更加容易實現物件導向。

缺點:

  • 反射會消耗一定的系統資源,因此,如果不需要動態地建立一個物件,那麼就不需要用反射;
  • 反射呼叫方法時可以忽略許可權檢查,獲取這個類的私有方法和屬性,因此可能會破壞類的封裝性而導致安全問題。

如何使用Java的反射

通過一個全限類名建立一個物件

Class.forName(“全限類名”); 例如:com.mysql.jdbc.Driver Driver類已經被載入到 jvm中,並且完成了類的初始化工作就行了

類名.class; 獲取Class<?> clz 物件

物件.getClass();

獲取構造器物件,通過構造器new出一個物件

Clazz.getConstructor([String.class]);

Con.newInstance([引數]);

通過class物件建立一個範例物件(就相當與new類名()無參構造器)

Cls.newInstance();

通過class物件獲得一個屬性物件

Field c=cls.getFields():獲得某個類的所有的公共(public)的欄位,包括父類別中的欄位。

Field c=cls.getDeclaredFields():獲得某個類的所有宣告的欄位,即包括public、private和proteced,但是不包括父類別的宣告欄位

通過class物件獲得一個方法物件

Cls.getMethod(“方法名”,class……parameaType);(只能獲取公共的)

Cls.getDeclareMethod(“方法名”);(獲取任意修飾的方法,不能執行私有)

M.setAccessible(true);(讓私有的方法可以執行)

讓方法執行

Method.invoke(obj範例物件,obj可變引數);-----(是有返回值的)

//測試類
public class Demo {
    public String name;
    public void inputAndoutput {
        BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String aa;
        while ( !(aa= br.readLine()).equals("bye")){
            bufferedWriter.write(aa);
            bufferedWriter.newLine();
            bufferedWriter.flush();
        }
        br.close();
        bufferedWriter.close();
    }
    public Demo(){
    }
    public void print(){
    	System.out.println(this.name);
    }
    public void reverseWords(String s) {
    	System.out.println(s);
		return s;
    }
}
//利用反射
  Class c=new Demo().getClass();
        System.out.println(c.toString());
        Class[] classes=c.getClasses();
        for (Class ca:classes){
            System.out.println(ca.toString());
        }
        Arrays.stream(c.getFields()).forEach(s->{
            System.out.println(s.toString());
        });

到此這篇關於Java反射機制詳解的文章就介紹到這了,更多相關Java反射內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com