JAVA反射機制

反射核心類

Class

ClassLoader

程序的運行過程

圖解:
反射_程序的運行過程
1.ClassLoader將其Load到內存彙總的CodeSegment
2.運行環境找到main纔開始執行
3.動態加載機制,運行過程中會有更多class被load到內存

ClassLoader的類的加載機制

1.非一次性加載
2.運行期間動態加載
3.static語句塊(靜態代碼塊)在加載後執行一次
4.dynamic語句(動態代碼塊)塊在每次new新的對象之後會執行(構造方法之後運行,等同於構造方法內的語句)

-verbose:class 控制檯顯示詳細加載過程

TestDynamicLoading.java


public class TestDynamicLoading {

    public static void main(String[] args) {
        new A();
        System.out.println("**----------**");
        new B();

        new C();
        new C();

        new D();
        new D();
    }

}

class A {

}

class B {

}

class C {
    static {
        System.out.println("CCCCCCCCCC");
    }
}

class D {
    {
        System.out.println("DDDDDDDDDD");
    }
}

運行控制檯輸出(E:/WorkSpace爲工作空間)

...
[Loaded A from file:/E:/WrokSpace/TestReflect/bin/]
**----------**
[Loaded B from file:/E:/WrokSpace/TestReflect/bin/]
[Loaded C from file:/E:/WrokSpace/TestReflect/bin/]
CCCCCCCCCC
[Loaded D from file:/E:/WrokSpace/TestReflect/bin/]
DDDDDDDDDD
DDDDDDDDDD
...

JDK內置的ClassLoader

  • bootstrap classloader
    核心加載類,本地語言編程,不可以讀取
  • extesion classloader
    擴展加載類,jdk擴展類,jdk/jre/lib/ext目錄下的類,可被讀取
  • applicatioon classloader
    用戶自定義類加載類,
  • other classloader
    SecureClassLoader
    URLClassLoader

TestJDKClassLoader.java

JDKClassLoader的層次關係(不是繼承)

所有的classloader都是從java.lang.classloader繼承而來的
getParent()方法是獲取當前加載類的上一級加載對象,而不是父類
問parentloader加載後就不再加載,即parentloader加載以後sonloader不再加載,保證程序運行加載安全機制,如application classloader不可以加載bootstrap classloader中聲明的類。

反射

Class c = Class.forName(str);
Object o = c.newInstance();
Method[] methods = c.getMethods();
for (Method mmethod) {
    if (m.getName().equals("m")) {
        m.invoke(o);
        m.getParameterTypes();
    }
}

關於invoke()方法,是可變參數方法,第一個參數傳入方法體所在對象,第二+個參數出入方法對應傳入的參數。
實現接口的方法可以確定參數個數及類型,接口new對象的方法的可擴展性。
關於getParameterTypes()方法,返回傳參類型。
關於getReturnType()方法,返回方法的返回類型。

通過反射的API接口,去探索運行期間的一個Class的內部結構,並且根據內部結構來決定方法怎麼進行調用。

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