2012-02-10 9 views
6

私は、AspectJを使ってグラフィックスクラスへの呼び出しをトレースしています。 これまでは、事前に織り込まれたjavax.swing。*クラスを使用しましたが、ロード時に、JVMに-Xbootclasspath/pスイッチを使用して、これらのクラスを使用するよう指示しました。AspectJを使用したjavax.swing。*クラスの読み込み時間

ローディング・タイム・ウィービング・モードに切り替える必要があります。 誰でもロード時にjavax.swingを織る方法を教えてください。私はネットを検索しましたが、それでもやる方法はわかりません。私は、AspectJのロードタイムウィーバーがデフォルトでjava。*とjavax。*クラスを作成しないことを知っています。誰かが

-Xsetを使うことを提案:ウィーバーは、クラスローダに添付される前javax.swingのクラスがロードされているのでweaveJavaPackages =真、weaveJavaxPackages =真

aop.xmlでなく、これのどれも助けました。私はウィーバーがこれらのクラスを全く見ないと思う。

どのようにしてjavax.swingクラスを動的に組み立てることができますか?私は最初にウィーバーを登録し、次にクラスをロードするカスタムクラスローダーを実装する必要がありますか?

解決策をお聞かせください。私は何もでてるん

+0

私はあなたにはうってつけの答えがありません。ウィーバーがロードされる前にロードされているのとまったく同じ理由で、Javaクラスとjavaxクラスを組み立てるのは非常に難しいです。カスタムクラスローダーが役立つかもしれませんが、 –

+0

確かに、ロード時にJavaブートクラスを織り込むのは非常に難しいようですが、私はこの実装にカスタムウィーバーを使用している人もいると聞いていますが、誰も共有していません – Gonny

+1

これは難しいことであるとの上記の意見に同意します。これを達成しようとしている理由(つまりあなたの本当の問題が何であるか)を教えてください。 –

答えて

1

は、専門家を意味するが、これは有望に見えるながら:

具体的

Configuring Load-time Weaving with aop.xml files

<aspectj> 
    <aspects> 
    ... 
    </aspects> 
    <weaver options="-verbose"> 
    <!-- Weave types that are within the javax.* or org.aspectj.* 
     packages. Also weave all types in the foo package that do 
     not have the @NoWeave annotation. --> 
    <include within="javax.*"/> 
    <include within="org.aspectj.*"/> 
    <include within="([email protected] foo.*) AND foo.*"/> 
    ... 
    </weaver> 
</aspectj> 

私はそれが使用さClassPreProcessor与えられた仕事ができるかどうかはわかりませんLTWの代理人(私はそれを試していないが)。

public byte[] preProcess(String className, byte[] bytes, ClassLoader loader, ProtectionDomain protectionDomain) { 
    if (loader == null || className == null || loader.getClass().getName().equals(deleLoader)) { 
     // skip boot loader, null classes (hibernate), or those from a reflection loader 
     return bytes; 
    } 
    ... 
    try { 
     synchronized (loader) { 
      ... 
      WeavingAdaptor weavingAdaptor = WeaverContainer.getWeaver(loader, weavingContext); 
      ... 
     } 
    } 
} 

ブートローダークラスがスキップされるか、それはかなり明確になります。ここではそのpreProcess方法の始まりです。さらに、WeaverContainer.getWeaver()呼び出しは、aop.xmlの処理をトリガーするように見え、nullでないローダーを持つクラスが処理されるまで発生しません。

実際の解決に役立ちますが、うまくいけば、それは物事は​​彼らが行うように動作する理由についていくつかの光を投げかけているどのくらいわからない...

0

まさにあなたがいないこと、ハードではなく、非常に簡単中途半端そこ そのです。

<?xml version="1.0" encoding="UTF-8"?> 
<aspectj> 
    <aspects> 
<aspect name="com.ciena.EDTCheck"/> 
</aspects> 
    <weaver options="-Xset:weaveJavaxPackages=true -verbose">  
    </weaver> 
    </aspectj> 

あなたは-javaagentのようなjavaagentで

aspectjweaver.jarがあることを確認します。また、必ず、あなたのことを確認

aspectjweaver.jar \ aspectj1.8 \ libに\:Cをaop。XMLは、上記のMETA-INFフォルダにある

あなたが-javagaentが得られることを確認して、コマンドラインから実行したい場合は、すべてのは、Eclipseまたは一部のIDE

から実行することです

すぎ

+0

あなたは実際に試したことがありますか、それはあなたのために働くのですか?私にとってはそうではありません。 – kriegaex

2

唯一の解決策I javaxパッケージのexecution()ポイントカットを使用する必要がある場合は、JREのtools.jarをバイナリー製織し、独自の織りバージョンを作成することをお勧めします。私はこれまでに、うまくいきました。しかしこれは、アプリケーションを実行する実行時環境を制御できる場合にのみ選択できます。

このような方法を使用したくない場合は、call()ポイントカットを使用する必要があります。こうすることで、自分のアプリケーションやLTWの影響を受ける第三者のライブラリによって行われた呼び出しをキャプチャできます。ブートクラスローダーによってロードされたJREクラスによって行われた呼び出しだけが、あなたの面をエスケープします。

関連する問題