JavaエージェントとJavassistを使用して、いくつかのJDKクラスにいくつかのログを追加しています。基本的に、システムがいくつかのTLSクラスをロードすると、Javassistはいくつかのバイトコードを追加して、いくつかの接続の問題をデバッグする手助けをします。のは、私はJavassistのを使用してそのクラスを呼び出すようにしようとしたとしましょう、私のエージェントの変換方法ではJavaエージェントでクラスパスにクラスを追加する
package com.something.myagent;
public class MyAgentPrinter {
public static final void sayHello() {
System.out.println("Hello!");
}
}
:ここ
は、このクラスは、エージェントJARに含まれている与えられた、問題だ// 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)
thを追加する方法はありますかクラス[MyAgentPrinter
]のアプリケーションのクラスパスに? the java.lang.instrument
package documentationで指定され
システムクラスローダー(ClassLoader.getSystemClassLoaderを参照)によってエージェントクラスがロードされますが、問題の問題はクラス 'AgentPrinter'が見つからないということです。 'AgentPrinter'が' MyAgent'と同じディレクトリにある場合は、それ以外の場合はそうであるかもしれません。 – rakwaht
@rakwaht:Javassistが失敗しない理由を説明します。失敗します。 – Holger
あなたは正しいと思われます。私はそれが間違っていたので私の答えを削除しました。 PS:私はupvoted :) – rakwaht