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);
}
%>
这篇关于哪个类加载器加载了所提供实例的类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:哪个类加载器加载了所提供实例的类
基础教程推荐
猜你喜欢
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01