我可以爲您提供2個解決方案。
- 獲取類包,並檢查其是否開始與
java.
,sun.
,com.sun.
- 獲取類的類裝載器:
Returns the class loader for the class. Some implementations may use
null to represent the bootstrap class loader. This method will return
null in such implementations if this class was loaded by the bootstrap
class loader.
正如你可以看到他們說「一些暗示可能會返回null「。這意味着對於這些實現clazz.getClassLoader() == null
意味着該類由引導類加載器加載,因此屬於JRE。順便說一下,這對我的系統(Java(TM)SE運行時環境(版本1.6.0_30-b12))有效。
如果不檢查的ClassLoader#getParent()
文檔:
Returns the parent class loader for delegation. Some implementations may
use <tt>null</tt> to represent the bootstrap class loader. This method
will return <tt>null</tt> in such implementations if this class loader's
parent is the bootstrap class loader.
此外,一些實現將返回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.");
}
我相信這是對的情況下99%的不夠好。
爲什麼在運行時需要知道這一點? –
嘗試String isJREClass(Class cl){return cl.getClassloader()。toString();} –
我需要它進行Arquillian測試:我想發現一個類自動使用的所有類,以便將它們添加到Test '檔案>'。但是,如果它是一個JRE,沒有必要,所以我想檢測它... –