【发布时间】:2017-10-19 14:38:16
【问题描述】:
我正在使用 Java 代理和 Javassist 向一些 JDK 类添加一些日志记录。本质上,当系统加载一些 TLS 类时,Javassist 会向它们添加一些额外的字节码,以帮助我调试一些连接问题。
这就是问题所在,因为这个类包含在代理 jar 中:
package com.something.myagent;
public class MyAgentPrinter {
public static final void sayHello() {
System.out.println("Hello!");
}
}
在我的代理的转换方法中,假设我尝试使用 javassist 调用该类:
// this is only called for sun.security.ssl.Handshaker
ClassPool cp = getClassPool(classfileBuffer, className);
CtClass cc = cp.get(className);
CtMethod declaredMethod = cc.getDeclaredMethod("calculateKeys");
declaredMethod.insertAfter("com.something.myagent.MyAgentPrinter.sayHello();");
cc.freeze();
return cc.toBytecode();
你认为这行得通,但我得到了这个:
java.lang.NoClassDefFoundError: com/something/myagent/MyAgentPrinter
at sun.security.ssl.Handshaker.printLogLine(Handshaker.java)
at sun.security.ssl.Handshaker.calculateKeys(Handshaker.java:1160)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:292)
有没有办法将该类 [MyAgentPrinter] 添加到应用程序的类路径中?
【问题讨论】:
标签: java classpath bytecode javassist javaagents