雙親委派模型&動態生成Java類

啓動類加載器(Bootstrap Class-Loader),加載 jre/lib 下面的 jar 文件,如 rt.jar。

修改核心類庫能夠使用下面的命令:java

# 指定新的 bootclasspath,替換 java.* 包的內部實現
java -Xbootclasspath:<your_boot_classpath> your_App
 
# a 意味着 append,將指定目錄添加到 bootclasspath 後面
java -Xbootclasspath/a:<your_dir> your_App
 
# p 意味着 prepend,將指定目錄添加到 bootclasspath 前面
java -Xbootclasspath/p:<your_dir> your_App

咱們能夠使用public final ClassLoader getParent();來獲取父類加載器,可是在一般的JDK/JRE實現中,擴展類加載器getParent()都只能返回null。bootstrap

擴展類加載器(Extension or Ext Class-Loader),負責加載咱們放到jre/lib/ext/目錄下的jar包。這就是所謂的extension機制。該目錄能夠經過設置「java.ext.dirs」來覆蓋。

java -Djava.ext.dirs=your_ext_dir HelloWorld

應用類加載器(Application or App Class-Loader),就是加載咱們最熟悉的 classpath 的內容。這裏有一個容易混淆的概念,系統(System)類加載器,一般來講,其默認就是 JDK 內建的應用類加載器,可是它一樣是可能修改的,好比:

java -Djava.system.class.loader=com.yourcorp.YourClassLoader HelloWorld

對於一個普通的 Java 動態代理,其實現過程能夠簡化成爲:

  • 提供一個基礎的接口,做爲被調用類型(com.mycorp.HelloImpl)和代理類之間的統一入口,如 com.mycorp.Hello。
  • 實現InvocationHandler,對代理對象方法的調用,會被分派到其 invoke 方法來真正實現動做。
  • 經過 Proxy 類,調用其 newProxyInstanc方法,生成一個實現了相應基礎接口的代理類實例,能夠看下面的方法簽名。
相關文章
相關標籤/搜索