java獲取反射機制的三種方式


背景

今天面試,面試官問了我一個問題,“java中的反射機制是什么,實現反射機制主要有哪幾種方式?”,因為做項目的時候沒怎么接觸過反射機制,所有也沒答上來,事后查閱資料后才有一定的了解。

反射機制

Java反射機制是在運行狀態中,對於任何一個類,都能夠知道這個類的所有屬性和方法;對於任何一個對象,也都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

java獲取反射機制的三種方式

建立一個學生類:

public class Student{
    private int id;
    String name;
    protected boolean sex;
    public float score;
}
通過new對象實現反射機制
public class Get{
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一:通過建立對象(即通過對象實例獲取)
        Student stu = new Student();
        Class classobj1 = stu.getclass();
        System.out.println(classobj1.getName());
    }
}
通過路徑實現反射機制
public class Get{
    public static void main(String[] args) throws ClassNotFoundException {
        //方式二:通過路徑實現反射機制
        Class classobj2 = Class.forName("fanshe.Student"); //fanshe.Student表示類的路徑
        System.out.println(classobj2.getName());
    }
}
通過類名實現反射機制
public class Get{
    public static void main(String[] args) throws ClassNotFoundException {
        //方式三:通過類名實現反射機制
        Class classobj3 = Student.class;
        System.out.println(classobj3.getName());
    }
}

靜態編譯和動態編譯

  • 靜態編譯:在編譯時確定類型,綁定對象
  • 動態編譯:運行時確定類型,綁定對象
反射機制的優缺點
  • 優點:運行期類型的判斷,動態加載類,提高代碼靈活度
  • 缺點:運行時確定類型,綁定對象
反射的應用場景

反射是框架設計的靈魂。
雖然在平時的項目開發中可能很少會使用到反射機制,但這不能說明反射機制沒有用,事實上很多設計和開發都與反射機制有關,如模塊化的開發,會通過反射去調用對應的字節碼;動態代理設計模式也采用了反射機制。還有一些場景如下:

  • 在使用JDBC連接數據庫時,會使用Class.forName()通過反射來加載數據庫的驅動程序;
  • Spring框架的IOC(動態加載管理Bean)創建對象以及AOP(動態代理)功能都和反射機制有關系;
  • 動態配置實例的屬性;
  • ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM