本文介紹了哪個類加載器加載了所提供實例的類的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在JEE環境中,了解特定類的加載位置非常有用。
例如,我有一個由某個黑匣子庫提供的org.slf4j.Logger
實例。有可能找到負責的類加載器嗎?如果實例的類來自JDK、應用服務器、EAR或Web應用程序類加載器?
推薦答案
原來很簡單。類加載器的名稱由:
返回
object.getClass().getClassLoader().getName()
它返回類似于&q;app&q;或&q;Platform&q;之類的內容。請注意–如果類屬于引導類加載器,則類加載器是null
,就像JUL記錄器java.util.logging.Logger
那樣。
WebLogic有一長串沒有名稱的類加載器。WebLogic的類加載器包含一個有用的字段annotation
。人們可以閱讀它來找到JEE應用程序,類加載器屬于:
public Object getAnnotation(ClassLoader classloader) {
try {
Method amethod = classloader.getClass().getMethod("getAnnotation");
return amethod.invoke(classloader);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
return "";
}
}
如果您希望打印所有可用類加載器的概述而不挖掘注釋,則可以使用類加載器實例的哈希代碼。這是一個小的JSp頁面。將其放到您的Web項目的webapp
目錄中以快速查看。
<%
response.setContentType("text/plain");
List<Class<?>> clazzes = List.of(Logger.class, object.getClass());
out.println("CLASSLOADERS:
");
ClassLoader classloader = new Object() {}.getClass().getClassLoader();
while (classloader != null) {
out.println(
String.format("%-18s", classloader.getName()) + " " +
String.format("%-10s", Integer.toHexString(classloader.hashCode())) + " " +
classloader.getClass().getName() + " / " + getAnnotation(classloader));
classloader = classloader.getParent();
}
out.println("
CLASSES:
");
for (Class<?> clazz : clazzes) {
ClassLoader cloader = clazz.getClassLoader();
URL location = Optional.of(clazz.getProtectionDomain()).map(x->x.getCodeSource()).map(x->x.getLocation()).orElse(null);
out.println(
clazz + "
" +
(cloader != null ? Integer.toHexString(cloader.hashCode()) : "<bootstrap>") + " " +
location);
}
%>
這篇關于哪個類加載器加載了所提供實例的類的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,