sun.misc.Launcher.AppClassLoader - デフォルトのシステムクラスローダーです。javaはどのようにしてクラスローダーを認識しますか?
このクラスローダーによってユーザークラスがロードされます。
例えば:
public static void main(String args[]) throws Exception {
A a = new A();
System.out.println(a.getClass().getClassLoader());
}
戻りsun.misc.Launcher $ AppClassLoader。
クラスAは、sun.misc.Launcher.AppClassLoader.loadClass(var1、var2)メソッドによってロードされます。 Javaは、このクラスを暗黙的にロードするようにトリガーします。
しかし、前述の方法でロードロジックが見つかりませんでした。 そのコードでは、クラスローディングを親クラスローダに委任しているようです。しかし、その場合、AppClassLoaderの代わりに親クラスローダを返さなければなりません。
また、このメソッドでは、このクラスローダーによってクラスがロードされていないように見えますが、javaはユーザークラスに対してこれを正確に返します。
- なぜですか?
- どのように動作しますか?
sun.misc.Launcher.AppClassLoaderのこの逆コンパイルされた方法:ここでは
public Class<?> loadClass(String var1, boolean var2) throws ClassNotFoundException { int var3 = var1.lastIndexOf(46); if(var3 != -1) { SecurityManager var4 = System.getSecurityManager(); if(var4 != null) { var4.checkPackageAccess(var1.substring(0, var3)); } } if(this.ucp.knownToNotExist(var1)) { Class var5 = this.findLoadedClass(var1); if(var5 != null) { if(var2) { this.resolveClass(var5); } return var5; } else { throw new ClassNotFoundException(var1); } } else { return super.loadClass(var1, var2); } }
私はまだあなたが何を求めているのか分からない。 –
私はあなたの質問を理解していません...しかし、ここで見てみてくださいhttp://www.javaworld.com/article/2077260/learn-java/learn-java-the-basics-of-java-class-loaders.html多分それはあなたを少し助けます。そしてあなたの編集については、この方法のどれを理解できないのですか? – Hrabosch
提供していただきありがとうございます。基本的な情報としては良いですが、私の質問には答えません。私は、「VMのクラスを定義する」ということになっている部分がどこにあるのか分かりません。このメソッドは実際にクラスをロードするのではなく、ロードをさらに親クラスローダに委譲します。 –