AOPを使用して実行中のJavaスレッドのツリーを追跡するタスクを解決する

このopusは、記事habrahabr.ru/blogs/java/74208に関連して登場しました。



UPD。 より適切なソリューションとディスカッションはhabrahabr.ru/blogs/java/74208/#comment_2141270です



意図したとおりの情報を以下に示しますが、まだ機能しません(まったく機能しない可能性があります:()。3つのことを行う必要があります。



まず、インターフェイスを作成し、 java.lang.Thread



クラスに実装させます。

 public interface TreeInfo { public Thread getParentThread(); }
      
      







次に、Threadクラスのコンストラクターを呼び出すときに、 Thread.currentThread()



値をThread.currentThread()



に保存する必要があります。



第三に、どういうわけか「このゴミをすべて捨てる」必要があります。







最初の2つのポイントは、次のように解決されます。



クラスを作成する



 public class ThreadTreeMixin { Object target; Thread parent; public ThreadTreeMixin(Object target) { this.target = target; this.parent = Thread.currentThread(); } public Thread getParentThread() { return parent; } } //*  Object target   -     "".
      
      







そして、 TreeInfo



インターフェースとThreadTreeMixin



クラスをjava.lang.Thread



と混合したいことをJBoss AOPに伝えjava.lang.Thread



。 これを行うには、プログラムリソースに次の内容のMETA-INF / jboss-aop.xmlファイルを作成します。

 <aop> <introduction class="java.lang.Thread"> <mixin> <interfaces> threadtree.TreeInfo </interfaces> <class>threadtree.aspects.ThreadTreeMixin</class> <construction>new threadtree.aspects.ThreadTreeMixin(this)</construction> </mixin> </introduction> </aop>
      
      







そして最後の「機能しない」部分(段落3)。



通常どおりこれで離陸します-javaagentを使用します。

 java -javaagent:jboss-aop-single.jar -classpath myapp.jar:... myapp.Main


エージェント自体はすでにファイルmyapp.jar!/META-INF/jboss-aop.xmlの内容を読み取り、バイトコードを使用して必要な操作を実行します。



そして今、最も悲しいことは、明らかに、JBoss AOPはJREクラスで動作することを望んでいないということです。 誰かが解決策を教えてもらえますか? AspectJでは、少なくともドキュメントでは、システムクラスをサポートしていない(直接classLoader == nullである)と書かれています。



All Articles