【发布时间】:2022-01-18 23:19:56
【问题描述】:
我阅读了https://www.baeldung.com/java-instrumentation 并尝试在org.springframework.web.servlet.DispatcherServlet 中检测doService 方法,它是Spring Boot 框架的一部分,即spring-webmvc.jar。
这是我启动 Spring Boot 应用程序的方式:
java -javaagent:agent.jar -jar myapp.jar
我了解我的代理的 pom.xml 应该打包/包含 javassist 依赖项,但我不希望代理应该打包/包含包含类 org.springframework.web.servlet.DispatcherServlet 的 jar spring-webmvc.jar,因为它已经打包并包含在myapp.jar
在代理的premain 中,当我尝试使用forName 检测和加载类org.springframework.web.servlet.DispatcherServlet 时,它会抛出ClassNotFoundException。
我应该如何指示代理从myapp.jar 加载它?
谢谢!
try {
targetCls = Class.forName(className);
targetClassLoader = targetCls.getClassLoader();
LOGGER.log(Level.INFO, "Successfully obtain target class {0} and its classloader using 'forName' with class loader {1}", new Object[] {className, targetClassLoader.toString()});
} catch (Exception ex) {
LOGGER.log(Level.SEVERE, "Class {0} not found with Class.forName. {1}", new Object[] {className, ex.getClass().getCanonicalName()});
}
【问题讨论】:
-
为什么要手动加载类?在类加载期间注册一个 Instrumentation Transformer 并转换目标类还不够吗?此外,您的应用程序是哪种 JAR?一个或一个带有特殊类加载器的阴影之一,该类加载器可以动态地对 uber JAR 中的嵌套 JAR 进行本地化和解包?最好在 GitHub 上查看 MCVE 会有所帮助。尽可能减少它,同时它仍然会重现问题。
-
感谢您为我指明正确的方向。没错,我不必手动加载类,我应该在
premain中注册转换器,然后在transform方法中执行检测代码。
标签: java classloader instrumentation agent javaagents