我正在使用Java代理和Javassist向某些JDK類添加一些日誌記錄。本質上,當系統加載一些TLS類時,Javassist會向它們添加一些額外的字節碼來幫助我調試一些連接問題。使用Java代理向類路徑添加一個類
這裏的問題,因爲這個類是包含在代理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
]到應用程序的類路徑?
您說'代理類將由系統類加載器加載(請參閱ClassLoader.getSystemClassLoader)。但是,問題中的問題是未找到類'AgentPrinter'。如果'AgentPrinter'和'MyAgent'在同一個目錄下,那麼你就可以這麼說,否則可能是我說的 – rakwaht
@rakwaht:我的答案解釋了爲什麼Javassist不會失敗,即找到類,而*測試代碼*失敗。 – Holger
看來你是對的。由於錯誤,我刪除了我的答案。 PS:我upvoted :) – rakwaht