クラスが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