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

Gon*_*nny 6 java swing aspectj

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

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

-Xset:weaveJavaPackages = TRUE,weaveJavaxPackages =真

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

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

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

ksc*_*eid 1

我绝不是专家,但这看起来很有希望:

使用 aop.xml 文件配置加载时编织

具体来说:

<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>
Run Code Online (Sandbox Code Playgroud)

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);
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这使得引导加载程序类如何被跳过变得非常清楚。此外,WeaverContainer.getWeaver()调用似乎会触发aop.xml处理,并且只有在处理具有非空加载器的类之后才会发生。

不确定这对实际解决方案有多大帮助,但希望它能解释为什么事情会这样......