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である)と書かれています。