Java 如何知道类是来自JRE还是来自外部Jar?
有人知道JRE中是否包含Java 如何知道类是来自JRE还是来自外部Jar?,java,introspection,Java,Introspection,有人知道JRE中是否包含Class变量(是否有库)吗 以下是我想要的: Class-stringClass=String.Class; System.out.println(TheMagickLibrary.isJREClass(stringClass));//应该显示为真 Class-anotherClass=AnyClass.Class; System.out.println(TheMagickLibrary.isJREClass(另一个类));//应该显示为false 我可以为您提供两种解
Class
变量(是否有库)吗
以下是我想要的:
Class-stringClass=String.Class;
System.out.println(TheMagickLibrary.isJREClass(stringClass));//应该显示为真
Class-anotherClass=AnyClass.Class;
System.out.println(TheMagickLibrary.isJREClass(另一个类));//应该显示为false
我可以为您提供两种解决方案
java.
,sun.
,com.sun.
clazz.getClassLoader()==null
意味着该类由引导类装入器装入,因此属于JRE。顺便说一句,这适用于我的系统(Java(TM)SE运行时环境(build 1.6.0_30-b12))
如果没有,请检查类加载器#getParent()的文档。
:
返回委托的父类加载器。某些实现可能会
使用null表示引导类装入器。这种方法
如果该类装入器
父类是引导类装入器。
同样,如果当前类装入器是引导程序,则某些实现将返回null
最后,我推荐以下策略:
public static boolean isJreClass(Class<?> clazz) {
ClassLoader cl = clazz.getClassLoader();
if (cl == null || cl.getParent() == null) {
return true;
}
String pkg = clazz.getPackage().getName();
return pkg.startsWith("java.") || pkg.startsWith("com.sun") || pkg.startsWith("sun.");
}
publicstaticbooleanisjreclass(类clazz){
ClassLoader cl=clazz.getClassLoader();
if(cl==null | | cl.getParent()==null){
返回true;
}
字符串pkg=clazz.getPackage().getName();
返回pkg.startsWith(“java”)| | pkg.startsWith(“com.sun”)| | pkg.startsWith(“sun”);
}
我相信这对于99%的情况来说已经足够了 我可以为您提供两种解决方案
java.
,sun.
,com.sun.
clazz.getClassLoader()==null
意味着该类由引导类装入器装入,因此属于JRE。顺便说一句,这适用于我的系统(Java(TM)SE运行时环境(build 1.6.0_30-b12))
如果没有,请检查类加载器#getParent()的文档。
:
返回委托的父类加载器。某些实现可能会
使用null表示引导类装入器。这种方法
如果该类装入器
父类是引导类装入器。
同样,如果当前类装入器是引导程序,则某些实现将返回null
最后,我推荐以下策略:
public static boolean isJreClass(Class<?> clazz) {
ClassLoader cl = clazz.getClassLoader();
if (cl == null || cl.getParent() == null) {
return true;
}
String pkg = clazz.getPackage().getName();
return pkg.startsWith("java.") || pkg.startsWith("com.sun") || pkg.startsWith("sun.");
}
publicstaticbooleanisjreclass(类clazz){
ClassLoader cl=clazz.getClassLoader();
if(cl==null | | cl.getParent()==null){
返回true;
}
字符串pkg=clazz.getPackage().getName();
返回pkg.startsWith(“java”)| | pkg.startsWith(“com.sun”)| | pkg.startsWith(“sun”);
}
我相信这对于99%的情况来说已经足够了 为什么您需要在运行时知道这一点?请尝试字符串isJREClass(Class cl){return cl.getClassloader().toString();}我需要它来进行Arquillian测试:我想自动发现类使用的所有类,以便将它们添加到测试
存档中。但是如果它是JRE类型的,就没有必要了,所以我想检测它……为什么在运行时需要知道这个呢?试试字符串isJREClass(Class cl){return cl.getClassloader().toString();}。我需要它来进行Arquillian测试:我想自动发现一个类使用的所有类,以便将它们添加到测试存档中。但是如果它是JRE的,就没有必要了,所以我想检测它…我首先测试了第一个解决方案,但后来我意识到一些外部JAR在sun.
或java.
中有类,而在javax中有类。
(javax.swing
尤其是)是JRE的一部分。。。它不是固溶体。我会试试getClassLoader()
one。好的,它似乎有效,谢谢!如图所示,我还尝试了clazz.getProtectionDomain().getCodeSource()
,并且似乎也能工作(但文档中不太清楚),我认为getProtectionDomain()是正确的解决方案。谢谢你的评论。你为什么这么想@AlexR?getCodeSource()
的Javadoc只是“返回这个域的代码源,它可能是空的”
”,与父引导加载程序无关……起初我测试了第一个解决方案,但后来我发现一些外部jar在sun.
或java.
中有类,而在javax.
(javax.swing
尤其是)是JRE的一部分…这不是一个可靠的解决方案。我会试试getClassLoader()
一个。好的,它似乎可以工作,谢谢!我也尝试了clazz.getProtectionDomain().getCodeSource()
如图所示,而且似乎也可以工作(但文档中不太清楚)我认为getProtectionDomain()是正确的解决方案。感谢您的评论。为什么您认为@AlexR?用于getCodeSource()
的Javadoc只是“返回此域的代码源,可能为空”
”,与父引导加载程序无关。。。
public static boolean isJreClass(Class<?> clazz) {
ClassLoader cl = clazz.getClassLoader();
if (cl == null || cl.getParent() == null) {
return true;
}
String pkg = clazz.getPackage().getName();
return pkg.startsWith("java.") || pkg.startsWith("com.sun") || pkg.startsWith("sun.");
}