Which classloader loaded a class of the provided instance(哪个类加载器加载了所提供实例的类)
本文介绍了哪个类加载器加载了所提供实例的类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在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);
}
%>
这篇关于哪个类加载器加载了所提供实例的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:哪个类加载器加载了所提供实例的类
猜你喜欢
- GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
- Eclipse 的最佳 XML 编辑器 2022-01-01
- java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
- 如何指定 CORS 的响应标头? 2022-01-01
- 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
- 转换 ldap 日期 2022-01-01
- 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
- 获取数字的最后一位 2022-01-01
- 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
- 未找到/usr/local/lib 中的库 2022-01-01