Javaクラスのノートを読み込みます

4472 ワード

テキストhttps://www.cnblogs.com/malcolmfeng/p/6485604.html
Java Class Loaderの原理分析
一、Class Loaderの役割
一つのプログラムが一つ以上のクラスのファイルを含んでいる場合、プログラム起動時には、mainメソッドのクラスのクラスのクラスのクラスのファイルがプログラムの入り口としてJVMにロードされ、その後、プログラム呼び出しの必要に応じて、他のクラスのファイルのロードが徐々に行われます。Class Loaderの役割は動的にクラスファイルをロードすることです。
ロードの結果:
classファイルをロードすると、メソッドエリアで「クラス情報のバイナリデータ」が生成されます。静的変数、静的方法、定数プールとクラスのコードを含み、同時にスタックの中でクラスオブジェクトを生成します。このオブジェクトはこの「バイナリデータ」を表します。
二、Javaデフォルトの三つのクラスLoader
1.Bootstrap Class Loaderブートクラスのキャリアは、javaクラスのキャリアの中で一番上のクラスのキャリアであり、JDKのコアクラスをロードするのは担当しています。このクラスのキャリアにはどのような関連jarまたはクラスファイルがロードされていますか?
  URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();  
  for (int i = 0; i < urls.length; i++) {  
      System.out.println(urls[i].toExternalForm());  
  }
以下のコードを使ってもいいです。
  System.out.println(System.getProperty(“sun.boot.class.path"));
ps:(bootstrap Class Loaderは引き継がれてからではなく、C++で作成され、JVMカーネルに埋め込まれています。)
2.Extension Class Loader:拡張類キャリアは、jre/lib/ext/ディレクトリ下のすべてのjarをロードする責任があります。
3.App Class Loader:システムアプリケーションクラスのキャリアは、主にアプリケーションのクラスパスディレクトリのすべてのjarとクラスファイルをロードする責任があります。
三、両親依頼の仕組み:
ローディングクラスの過程で、Bootstrapは先にローディングを行い、もしローディングされていなかったら、extensionは再ローディングを行います。もしまだローディングされていなかったら、Appにロードします。ユーザ定義Stringなどのコアアプリにおけるクラスを回避した。もし同じnameのクラスファイルが同じクラスのLoaderによってロードされていないなら、JVMもこれは二つの異なるクラスのファイルだと思います。
以下のコードにより、クラスのすべてのキャリアをプリントアウトします。
  ClassLoader classloader= c1.getClassLoader();

  while(classloader!=null){

    System.out.println(classloader);

    classloader = classloader.getParent();

  }

  System.out.println(classloader);
カスタムキャリア
これらの三つの種類のキャリアを除いて、ユーザーは自分のクラスのキャリアをカスタマイズすることができます。JVMはすでにデフォルトの種類のキャリアを提供していますが、なぜ自分のクラスのキャリアを定義しますか?
Javaで提供されているデフォルトのクラスLoaderは、指定されたディレクトリのjarとクラスだけをロードしますので、他の場所のクラスやjarをロードしたい場合、例えば:私はネットワーク上のクラスの一つのファイルを読み込みたいです。動的にメモリに読み込むことによって、この種類の中の方法を呼び出して、私の業務ロジックを実現します。このような状況では、デフォルトのクラスリーダーは私たちの需要を満たすことができませんので、自分のクラスリーダーを定義する必要があります。
クラスのキャリアをカスタマイズするにはどうすればいいですか?
1、java.lang.lassLoaderを継承する
2、親タイプのfindClassを書き換える方法
父の種類はそんなに多い方法があって、どうしてどうしてもfindClassの方法だけを書き直しますか?
JDKはすでにloadClass方法の中でClass Loaderサーチクラスのアルゴリズムを実現してくれました。loadClass方法でクラスを検索できない場合、loadClass方法はfindClassメソッドを呼び出してクラスを検索しますので、この方法を書き換えるだけでいいです。特別な要求がない場合は、一般的にloadClassサーチクラスのアルゴリズムを書き換えることを提案しない。
小テスト1:
Class Loader Test.classをClass Loader Test.jarに包んで、Extension Class Loaderのローディングディレクトリの下に置いて、コードを再実行します。はextでロードされます。
小テスト2:
Bootstrcp Class LoaderでClass Loader Test.classをロードするには、2つの方法があります。
1、jvmに-Xboot classpathパラメータを追加して、Bootstrcp Class Loaderロードクラスのパスを指定して、私達自身のjarを追加します。
2、クラスの書類をJAVA_に置く。HOME/jre/clases/ディレクトリの下で
ガイドがプログラムを実行する前にロードするクラス
// JDK  
JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
// idea  
IDEA_HOME = /Applications/IntelliJ IDEA.app/Contents
//     
WORK_PATH = /Users/jiaoningbo/Other/learning
// maven    
MAVEN_REPOSITORY = /Users/jiaoningbo/.m2

   :  com.reven.common.ClassLoader    main  
{JAVA_HOME}/bin/java "
-javaagent
:{IDEA_HOME}/lib/idea_rt.jar=60737
:{IDEA_HOME}/bin" 
-Dfile.encoding=UTF-8 
-classpath {JAVA_HOME}/jre/lib/charsets.jar
:{JAVA_HOME}/jre/lib/deploy.jar
:{JAVA_HOME}/jre/lib/ext/cldrdata.jar
:{JAVA_HOME}/jre/lib/ext/dnsns.jar
:{JAVA_HOME}/jre/lib/ext/jaccess.jar
:{JAVA_HOME}/jre/lib/ext/jfxrt.jar
:{JAVA_HOME}/jre/lib/ext/localedata.jar
:{JAVA_HOME}/jre/lib/ext/nashorn.jar
:{JAVA_HOME}/jre/lib/ext/sunec.jar
:{JAVA_HOME}/jre/lib/ext/sunjce_provider.jar
:{JAVA_HOME}/jre/lib/ext/sunpkcs11.jar
:{JAVA_HOME}/jre/lib/ext/zipfs.jar
:{JAVA_HOME}/jre/lib/javaws.jar
:{JAVA_HOME}/jre/lib/jce.jar
:{JAVA_HOME}/jre/lib/jfr.jar
:{JAVA_HOME}/jre/lib/jfxswt.jar
:{JAVA_HOME}/jre/lib/jsse.jar
:{JAVA_HOME}/jre/lib/management-agent.jar
:{JAVA_HOME}/jre/lib/plugin.jar
:{JAVA_HOME}/jre/lib/resources.jar
:{JAVA_HOME}/jre/lib/rt.jar:{JAVA_HOME}/lib/ant-javafx.jar
:{JAVA_HOME}/lib/dt.jar:{JAVA_HOME}/lib/javafx-mx.jar
:{JAVA_HOME}/lib/jconsole.jar
:{JAVA_HOME}/lib/packager.jar
:{JAVA_HOME}/lib/sa-jdi.jar
:{JAVA_HOME}/lib/tools.jar
:{WORK_PATH}/target/classes
:{MAVEN_HOME}/repository/junit/junit/4.12/junit-4.12.jar
:{MAVEN_HOME}/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
:{MAVEN_REPOSITORY}/repository/org/jodd/jodd-all/4.2.0/jodd-all-4.2.0.jar
:{MAVEN_REPOSITORY}/repository/cn/hutool/hutool-all/4.0.7/hutool-all-4.0.7.jar 
com.reven.common.ClassLoader