クラスがJAVAタイプかユーザー定義タイプかを判断

1124 ワード


    /**
     *       JAVA          
     * @param clz
     * @return
     */
    public static boolean isJavaClass(Class> clz) {   
        return clz != null && clz.getClassLoader() == null;   
    }
 
  public static void main(String... args) {
    System.out.println(isJavaClass(Integer.class)); // true
    System.out.println(isJavaClass(BugMeNot.class)); // false
  }

なぜgetClassLoader()がnullでJAVAタイプなのか?
 
ここではJVMのクラスロードメカニズム:Bootstrap classLoaderについて説明します.
Bootstrap classLoader:native codeを採用して実現し、JVMの一部であり、主にJVM自身の仕事に必要なクラス、例えばjava.lang.*、java.uti.*などをロードする.これらのクラスは$JAVA_にあります.HOME/jre/lib/rt.jar.Bootstrap ClassLoaderはClassLoaderから継承されません.通常のJavaクラスではないため、下位層はC++で記述され、JVMカーネルに埋め込まれています.JVMが起動すると、Bootstrap ClassLoaderも起動し、コアクラスライブラリをロードした後、Extension ClassLoaderとApp ClassLoaderクラスローダを構築します.
BootStrap ClassLoaderはrt.jarの下のファイル、つまりjavaの最も核心的な部分をロードします.次にextの下のファイルをExtension ClassLoaderによってロードします.さらにApp ClassLoaderがユーザー自身のファイルをロードします.
BootStrap ClassLoaderはc++で書かれているので、そのClassLoaderを返すとnullが返されます.
 
参考ブログ:getClass().getClassLoader()はnull