使用AspectJ加载javax.swing。*类的时间编织

时间:2012-02-10 21:28:17

标签: swing aspectj java

我正在使用AspectJ来跟踪对图形类的调用。 到目前为止,我已经使用了一组预先编织的javax.swing。*类,并且在加载时我告诉JVM使用这些编织类而不是使用-Xbootclasspath / p switch来使用JRE中的类。

我想切换到加载时间编织模式。 任何人都可以帮我如何在加载时编织javax.swing。我在网上搜索过,但我仍然无法弄明白该怎么做。我知道默认情况下,AspectJ加载时weaver不会编织java。*和javax。*类。有人建议使用

-Xset:weaveJavaPackages =真,weaveJavaxPackages =真

在aop.xml中,但没有一个帮助,因为在weaver附加到类加载器之前加载了javax.swing类。我想织布工根本看不到这些类。

如何设法动态编织javax.swing类?我应该实现一个首先注册weaver的自定义类加载器然后加载类吗?

有人可以建议任何解决方案吗?

3 个答案:

答案 0 :(得分:2)

如果您需要对execution()包使用javax切入点,我建议的唯一解决方案是二进制编织JRE的 tools.jar 并创建您自己的编织版。我过去做过,它运作得很好。但是,如果您可以控制运行应用程序的运行时环境,那么这只是一个选项。

如果您不想使用这种方法,则必须使用call()切入点。这样,您可以捕获由您自己的应用程序或受LTW影响的任何第三方库所进行的调用。只有由引导类加载器加载的JRE类所进行的调用才会逃避您的方面,这不应该太糟糕。

答案 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="(!@NoWeave foo.*) AND foo.*"/>
    ... 
  </weaver>
</aspectj>

我不确定LTW代理使用的ClassPreProcessor是如何工作的(尽管我还没试过)。这是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处理,并且直到处理了具有非空加载器的类之后才会发生。

不确定实际解决方案有多大帮助,但希望它能说明为什么事情会像他们那样行事......

答案 2 :(得分:0)

你正好在那里 它不是那么难,而是相当简单。

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

确保你有

  java中的

aspectjweaver.jar -javaagent:C:\ aspectj1.8 \ lib \ aspectjweaver.jar

还要确保上面的aop.xml位于META-INF文件夹

这一切都是从Eclipse或某些IDE

运行的

如果你想从命令行运行,请确保你也提供-javagaent