サービス用のプラグインを開発しています。それが機能するためには、サービスが提供しないいくつかのデータが必要です。
プラグインには厳密なロード/アンロード仕様があります。ベアプラグインは次のようになります。
public class Plugin extends JavaPlugin
{
@Override
public void onEnable() {} //Plugin enters here. Comparable to main(String[] args)
@Override
public void onDisable() {} //Plugin exits here, when service shuts down.
}
org.service.aClassというパッケージがあります。その中にはaMethodがあります。aMethodは次のようになります。
public boolean aMethod(boolean bool) {
return bool;
}
過度に単純化されたシナリオですが、機能します。私のプラグインは、aMethodが呼び出されるたびにboolの値を知る必要があります。これは私のプログラムにとって絶対に重要です。その値を取得する他の方法はありません。
aMethodをお勧めしますが、サービスの後にプラグインが読み込まれるため、これは機能しません。私が理解していることから、ロード時間の織り方は、後でロードされるため、ここでも適切ではありません。
それは機能しませんが、これが私が使用していた側面です。
public aspect LogAspect {
pointcut publicMethodExecuted(): execution(* org.service.aClass.aMethod(..));
after(): publicMethodExecuted(){
cat(String.format("Entered method: %s.",
thisJoinPoint.getSignature()));
List<Object> arguments = Arrays.asList(thisJoinPoint.getArgs());
List<Object> argTypes = new ArrayList<Object>();
for (Object o: arguments) {
argTypes.add(o.getClass().toString());
}
cat(String.format("With argument types: %s and values: %s.",
argTypes, arguments));
cat(String.format("Exited method: %s.", thisJoinPoint.getSignature()));
}
public void cat(Object dog) {
System.out.println("[TEST] " + dog);
}
}
私は現在、AspectJ:In Actionの本を私の横で開いています。すべてのロード時のウィービングの例で、プログラムは-javaagentフラグで開始する必要があると記載されています。私のプロラムはプラグインなので、これが起こる可能性はありません。
ASMも調べました。ここで、プロファイラー(基本的に私がやりたいこと)を構築するための素晴らしいチュートリアルを見つけました。
それに関する問題は、起動時に-javaagentフラグとpublic static premainを再び使用することです。したがって、onEnableとonDisableしかないため、不適切です。
次に、JavaのAttachAPIについて知りました。クラスがロードされた後、その外観から、エージェントであるプロファイラーをアタッチできるようになります。完璧に見えますが、30分ほど検索したところ、理解できる良い例が見つかりませんでした。
誰か助けてもらえますか?これはツーインワンの質問です:AspectJをこれに使用できますか?もしそうなら、どのように?また、それができない場合、誰かが私をASMプロファイラーでAttach APIを使用するための正しい方向に向けることができますか?
前もって感謝します!