2012-02-10 63 views
6

我正在使用AspectJ來跟蹤對圖形類的調用。 到目前爲止,我已經使用了一組預編的javax.swing。*類,並且在加載時,我通過使用-Xbootclasspath/p開關告訴JVM使用這些編織類而不是JRE中的類。加載時間使用AspectJ編織javax.swing。*類

我想切換到加載時織造模式。 任何人都可以幫助我如何在加載時編織javax.swing。我已經搜索了網絡,但我仍然無法弄清楚如何去做。我知道,默認情況下,AspectJ加載時織布工不會編織java。*和javax。*類。使用

-Xset有人建議:weaveJavaPackages = TRUE,weaveJavaxPackages = aop.xml中中真正

但沒有這種幫助,因爲織葉連接到類加載器之前javax.swing中的類加載。我猜織布工根本看不到這些類。

我該如何設法動態編織javax.swing類?我應該實現一個首先註冊一個織布工的自定義類加載器,然後加載類嗎?

有人可以提出任何解決方案嗎?

+0

我沒有一個好的答案給你,只是編織java和javax類非常棘手,因爲你說的原因(它們在加載weaver之前加載了一個自定義的類加載器可能有幫助,但沒有保證如果可能的話,我會堅持編譯時間編織 – 2012-02-11 04:08:48

+0

確實,編譯加載時間java引導類似乎很困難我聽說有些人使用自定義編織器來實現這個實現,但沒有人共享任何關於如何做到的規範 – Gonny 2012-02-11 12:39:32

+1

我同意上面的評論,這很難做到,也許如果你告訴我們你爲什麼要完成這個任務(即你真正的問題是什麼),我們可以爲你提供與編織的另一種方式 – 2013-04-18 22:46:43

回答

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的經紀人(儘管我還沒有嘗試過)。下面是它的preProcess方法的開頭:

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); 
      ... 
     } 
    } 
} 

這使得它非常清楚引導加載程序類是如何跳過。另外,WeaverContainer.getWeaver()調用似乎觸發了aop.xml處理,並且直到處理具有非空加載器的類後纔會發生。

不知道有多少,與實際的解決方案可以幫助,但希望它有助於理解的事情表現他們的方式有些光...

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:C:\ aspectj1.8 \ LIB \ aspectjweaver.jar

也確保您AOP。上面的XML是在META-INF文件夾

那是,如果你想從命令行中運行確保你給-javagaent那裏所有從Eclipse或一些IDE

運行過

+0

你有沒有嘗試過,併爲你工作?對我而言,它並不是。 – kriegaex 2014-10-21 10:08:18

2

唯一的解決辦法我可以建議你是否需要使用execution()切入點javax包是二進制編織JRE的tools.jar並創建自己的編織版本。我過去做過,它效果很好。但是,如果您可以控制運行應用程序的運行時環境,則這只是一個選項。

如果你不想使用這種方法,你將不得不求助於call()切入點。通過這種方式,您可以捕獲由您自己的應用程序或任何受LTW影響的第三方庫進行的調用。只有通過引導類加載器加載的JRE類進行的調用才能逃脫你的方面,這應該不會太糟糕。

相關問題