Java-反射、類加載機制

目錄

反射reflection

類加載機制:加載-鏈接-初始化

雙親委派:

迭代iterative和遞歸recursive的區別

方法重寫override和重載overload


反射reflection

        動態加載對象,並對對象進行剖析。在運行狀態中,任意類,可知其全部屬性和方法。任意對象,能夠調用其任意方法。
這種動態獲取信息以及動態調用對象方法的功能稱爲java反射機制。

//1、Class.forName(包名)
//2、對象.getClass
//3、類名.class;
優點:  動態創建對象和編譯,靈活性強
缺點:  影響性能
package com.leo.javabase;
//通過反射獲取類的class對象
public class 反射 {
    public static void main(String[] args) throws ClassNotFoundException {
        //1、Class.forName(包名)
        Class C1 = Class.forName("com.leo.javabase.User");
        System.out.println(C1.hashCode());
        //2、對象.getClass
        User user = new User();
        Class C2 = user.getClass();
        System.out.println(C2.hashCode());
        //3、類名.class;
        Class C3 = User.class;
        System.out.println(C3.hashCode());
    }

}
class User{
    private String name;private int age;private int id;
}
=============================
"C:\Program Files\Java\jdk1.8.0_231\bin\java.exe"
1300109446
1300109446
1300109446

Process finished with exit code 0

類加載機制:加載-鏈接-初始化

堆-new對象和數組
棧-基本變量類型和數值,還有引用的對象變量
方法區-包含了所有的class和static變量

  • 最基礎-rt.jar:Bootstrap ClassLoader(加載JDK的/lib目錄下的類)
  • 次基礎-擴展:Extension ClassLoader(加載JDK的/lib/ext目錄下的類)
  • 普通-程序:Application ClassLoader(程序自己classpath下的類)

雙親委派:

檢測安全性,其他加載器裏面有這個包就不會再加載你自定義的包

但是規則總有打破的概率!用戶一般把jdk中的基礎作爲一些api來調用,但也有api去調用用戶的代碼的情況,典型的如SPI代碼。SPI(服務提供接口)與API不同,面向拓展。
JDBC就是如此,在rt裏面定義了這個SPI,不同數據庫有各自的實現方式。Bootstrap ClassLoader就得委託子類來加載數據庫廠商們提供的具體實現。因爲它的手只能摸到<JAVA_HOME>\lib中,其他的它無能爲力。這就違反了自下而上的委託機制了。

所以jdk開發人員就引入了線程上下文類加載器(Thread Context ClassLoader),這類類加載器可以通過java.lang.Thread 類的setContextClassLoader方法進行設置。Thread.current.currentThread().getContextClassLoader()獲得類加載器來加載。

迭代iterative和遞歸recursive的區別

遞歸邊界:到一個條件停止遞歸,就是停止調用本身,不停止那就是循環。

遞歸體:調用本身不斷靠近邊界。

public class 遞歸求階乘 {
    public static void main(String[] args) {
        System.out.println(recursive(10));
    }
    public static int recursive(int n){
        if(n==1){
            return 1;
        }else{
            return n* recursive(n-1);
        }
    }
}

 

方法重寫override和重載overload

靜態方法-不能重寫,類一加載就出來了啊。所以重寫啥的只和非靜態的有關係。
1.發生在父類與子類之間 
2.方法名,參數列表,返回類型--相同 
3.訪問修飾符大於等於父類(public>protected>default>private不能重寫
4.異常小於等於父親

1.發生在一個類內部,多態性的一種表現 
2.同名方法的參數列表不同(類型、個數、順序) 
3.重載的時候,返回值類型可以相同也可以不相同。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章