java - 在 javaagent 中访问 servlet-api

标签 java tomcat servlets bytecode javaagents

我正在尝试从通过 -javaagent:my-agent.jar 标志添加到我的应用程序的 javaagent jar 中的 servlet-api 访问类。我的应用程序在 Tomcat 上运行。问题是我得到了一个 ClassNotFoundException,因为代理 jar 是由一个无法访问 servlet-api 类的类加载器加载的。

更具体地说,我想在我的 javaagent 中包含一个 ServletContainerInitializer

public class MyInitializer implements ServletContainerInitializer {
    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        System.out.println(ctx);
    }
}

META-INF/services/javax.servlet.ServletContainerInitializer

org.example.MyInitializer

结果是 ClassNotFoundException,因为找不到 ServletContainerInitializer。

有什么方法可以在 javaagent 中访问 servlet-api?或者更一般地说,是否可以访问通过 ApplicationClassLoader 加载的任何类,例如来自 spring 框架的类?

最佳答案

如果您的代理有一个 premain 方法,其签名如下

public static void premain(String agentArgs, Instrumentation inst)

你得到一个Instrumentation提供方法的对象 getAllLoadedClasses()getInitiatedClasses(ClassLoader) .现在每次都搜索这些数组并仅通过反射使用 Class 实例会很尴尬。但是您可以使用这些方法找到所需的 API 类,确定其运行时 ClassLoader 并创建一个新的 ClassLoader 将其用作解析父级并指向需要的代理类他们。

关于java - 在 javaagent 中访问 servlet-api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31191202/

相关文章:

java - Tomcat的 "Catalina service"和 "Servlet Engine"之间的区别

java - 使用 Java 1.6 在 Eclipse Mars 上运行 Ant

java - 无法访问 JPanel 的公共(public)方法/变量,并且无法从 Jpanel 访问其他公共(public)方法/变量

tomcat - kubernetes redinessProbe httpGet on tomcat 图像报告连接被拒绝

tomcat - 运行 Tomcat 6.0.43 时出错 : HTTP Connector node not found: set up one in the server. xml

java servlet : doPost is called but not doGet

java - JSON 简单解析器中超过 LONG.MAX_VALUE

java - Android:光标不会返回外部存储中应用程序文件夹中保存的所有视频

java - 由于 Java 程序,Tomcat 未启动

java - init 方法在 servlet 中一次又一次地调用