gpt4 book ai didi

java - 哪个类加载器加载了提供的实例的类

转载 作者:行者123 更新时间:2023-12-05 04:39:27 25 4
gpt4 key购买 nike

在 JEE 环境中,知道从何处加载特定类很有用。

例如,我有一个由某个黑盒库提供的 org.slf4j.Logger 实例。是否有可能找到负责的类加载器?如果实例的类来自 JDK、Application Server、EAR 或 Web Application 类加载器?

最佳答案

其实很简单。类加载器的名称由以下方式返回:

object.getClass().getClassLoader().getName()

它返回类似“app”或“platform”的内容。小心 - 类加载器为 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:\n");
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("\nCLASSES:\n");
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 + " \n " +
(cloader != null ? Integer.toHexString(cloader.hashCode()) : "<bootstrap>") + "\t" +
location);
}

%>

关于java - 哪个类加载器加载了提供的实例的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70451121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com