2016-12-29 11 views
-2

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はユーザークラスに対してこれを正確に返します。

  1. なぜですか?
  2. どのように動作しますか?

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); 
    } 
} 
+3

私はまだあなたが何を求めているのか分からない。 –

+0

私はあなたの質問を理解していません...しかし、ここで見てみてくださいhttp://www.javaworld.com/article/2077260/learn-java/learn-java-the-basics-of-java-class-loaders.html多分それはあなたを少し助けます。そしてあなたの編集については、この方法のどれを理解できないのですか? – Hrabosch

+0

提供していただきありがとうございます。基本的な情報としては良いですが、私の質問には答えません。私は、「VMのクラスを定義する」ということになっている部分がどこにあるのか分かりません。このメソッドは実際にクラスをロードするのではなく、ロードをさらに親クラスローダに委譲します。 –

答えて

1

はクラスAロード中に撮影したあなたの例のためのメインスレッドのスタックトレースです:

[native] java.lang.ClassLoader.defineClass1() <= this points to Laucher$AppClassLoader here 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:764) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
    at java.security.AccessController.doPrivileged(AccessController.java:-1) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    - locked <0x1f4> (a java.lang.Object) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at com.example.Main.main(Main.java:5) 

そしていくつかの準備後にネイティブコードでクラスの解析/定義が行われる /src/sh/VM /クラスファイル/ classFileParser.cppです:

instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, 
                Handle class_loader, 
                Handle protection_domain, 
                KlassHandle host_klass, 
                GrowableArray<Handle>* cp_patches, 
                TempNewSymbol& parsed_name, 
                bool verify, 
                TRAPS) { 
    // ... lots of code here 
    this_klass->set_class_loader(class_loader()); 
    // ... and here 
} 

CLASS_LOADERパラメータはLaucher $ AppClassLoaderのインスタンスへのハンドルです。 ここには何も神秘的ではありません。

関連する問題