getClass()について.getClassLoader()

4456 ワード

InputStream   is   =   getClass().getClassLoader().getResourceAsStream("helloworld.properties");中getClass()とgetClassLoader()はどういう意味ですか.getClass():現在のオブジェクトが属するClassオブジェクトを取得します   getClassLoader():このClassオブジェクトを取得するクラス・ローダ・クラス・ローダは、Java文字ファイルから文字ストリームをメモリに読み込み、Classクラス・オブジェクトを構築します.質問の場所で、ファイルの入力ストリームgetClass:public final Class getClass()を取得できます. Returns the runtime class of an object. That Class object is the object that is locked by static synchronized methods of the represented class. Returns: the object of type Class that represents the runtime class of the object.
getClassLoader public ClassLoader getClassLoader() Returns the class loader for the class. Some implementations may use null to represent the bootstrap class loader. This method will return null in such implementations if this class was loaded by the bootstrap class loader. If a security manager is present, and the caller´s class loader is not null and the caller´s class loader is not the same as or an ancestor of the class loader for the class whose class loader is requested, then this method calls the security manager´s checkPermission method with a RuntimePermission("getClassLoader") permission to ensure it´s ok to access the class loader for the class.
If this object represents a primitive type or void, null is returned.
Returns: the class loader that loaded the class or interface represented by this object. Throws: SecurityException - if a security manager exists and its checkPermission method denies access to the class loader for the class. See Also: ClassLoader, SecurityManager.checkPermission(java.security.Permission), RuntimePermission Class.getClassLoader()昨日私のcodeはいつもInteger.class.getClassLoader().getResource("*****");この文は空のポインタの異常を投げ出して、getClassLoader()としてnullを返して、jdkのドキュメントを調べて、もとはここにもう一つの落とし穴があります:jdkの中でgetClassLoader()の説明について:/**     * Returns the class loader for the class. Some implementations may use      * null to represent the bootstrap class loader. This method will return      * null in such implementations if this class was loaded by the bootstrap      * class loader.      *      * If a security manager is present, and the caller's class loader is      * not null and the caller's class loader is not the same as or an ancestor of      * the class loader for the class whose class loader is requested, then      * this method calls the security manager's checkPermission      * method with a RuntimePermission("getClassLoader")      * permission to ensure it's ok to access the class loader for the class.      *      * If this object      * represents a primitive type or void, null is returned. .....
上の英語は以下の言葉で理解できます.
クラスをロードするプロセスは非常に簡単です.クラスの場所を検索し、見つかったJavaクラスのバイトコードをメモリにロードし、対応するClassオブジェクトを生成します.Javaのクラスローダはこのようなプロセスを実現するために専用されています.JVMにはクラスローダが1つだけではありません.実際には、もしあなたが望むなら、JVMに無数のクラスローダを持たせることができます.もちろん、JVMをテストする以外に、他の用途は考えられません.クラス・マウント自体もクラスであり、メモリにマウントする必要があるという問題を発見したはずですが、これらのクラス・マウントは誰がマウントするのか、ルートが必要でしょう.そう、確かにこのような根が存在しています.それは神龍が頭を見ても尾を見ないBootstrap ClassLoaderです.なぜ神龍が頭を見ても尾を見ないと言っていますか.Javaコードの中でわずかな尾をつかむことができません.javaの運行環境に必要なすべてのクラスライブラリが、それによってロードされているからです.それ自体がC++で書かれたプログラムで、独立して実行することができて、JVMの実行の起点と言えるのは、偉大でしょう.Bootstrapがタスクを完了すると、Java実行環境拡張パッケージのクラスをマウントするための拡張クラスマウントExtClassLoader(実際にはシステムが使用していた拡張クラスマウントExtClassLoaderも使用していた)が生成されます.このクラスマウントこそ、ClassLoader.getSystemClassLoader()を呼び出して取得することができます.クラス・マウンタに関する操作設定や新しいクラス・マウンタのカスタマイズがプログラムで使用されていないと仮定すると、作成したjavaクラスはすべてそれによってマウントされます.尊敬に値します.AppClassLoaderがクラスを検索するエリアはよく知られているClasspathであり、初心者が乗り越えなければならない敷居でもあり、キラキラした感じがするかどうかは、そのクラス検索範囲によってクラスパスクラスマウンタと名付けられています.それとも以前に仮定した場合、Javaに新しいクラスが現れた場合、AppClassLoaderはまずクラスでその親クラスローダ、すなわちExtion ClassLoaderにクラスをロードできるかどうかを尋ね、できればAppClassLoaderはこの仕事をしない.同様にExtion ClassLoaderはロード時に親クラスローダに聞いてみる.クラスローダは実際には木の構造図であり、各クラスローダには自分の父親がいて、クラスローダはクラスをローダするときに、いつも自分の親ローダをローダさせ(どんなに目上の人を尊敬しているか)、親ローダがクラスをローダできない場合は、自分でローダし、それもロードできない場合は、申し訳ありません.class not found.クラスパスローダを直接使用してクラスをロードできなくなったときに放出されるのがNoClassDefFoundException異常です.カスタムクラス・ローダloadClassメソッドまたはClassLoaderのfindSystemClassメソッドを使用してクラスをロードする場合、意図的に変更しない場合は、ClassNotFoundExceptionが放出されます.
ここでjdkは、クラスがbootstrapによってロードされている場合、このクラスを通じてclassloaderを取得すると、new Object(.getClass().getClassLoader()を使用するとnullが返されるjdkの実装があります.これで上のコードにNull Pointer異常が発生するので、念のため自分で書いたクラスを使ってclassloader("this.getClass().getClassLoader(")")を取得したほうが問題ありません.