首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AspectJ加载javax.swing.*类的时间编织

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

Stack Overflow用户
提问于 2012-02-11 05:28:17
回答 3查看 1.7K关注 0票数 6

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

我想切换到加载时间编织模式。谁能帮助我如何在加载时间编织javax.swing。我已经在网上找过了,但我还是想不出怎么做。我知道在默认情况下,AspectJ加载时编织器不会编织java.*和javax.*类。有人建议使用

-Xset:weaveJavaPackages=true,weaveJavaxPackages=true

在aop.xml中,但所有这些都没有帮助,因为javax.swing类是在编织器附加到类加载器之前加载的。我猜编织者根本看不到这些类。

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

有没有人能提出一些解决方案呢?

EN

回答 3

Stack Overflow用户

发布于 2014-10-21 18:27:05

如果您需要将execution()切入点用于javax包,我建议的唯一解决方案是对tools.jar进行二进制编织,并创建您自己的编织版本。我以前也这么做过,效果很好。但是,只有当您能够控制运行应用程序的运行时环境时,这才是一种选择。

如果您不想使用这种方法,您将不得不求助于call()切入点。通过这种方式,您可以捕获由您自己的应用程序或受LTW影响的任何第三方库进行的调用。只有由引导类加载器加载的JRE类发出的调用才会逃脱您的方面,这应该不会太糟糕。

票数 2
EN

Stack Overflow用户

发布于 2013-04-25 12:33:41

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

Configuring Load-time Weaving with aop.xml files

具体地说:

代码语言:javascript
复制
<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方法的开头:

代码语言:javascript
复制
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);
            ...
        }
    }
}

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-10-20 21:20:35

确切地说,你已经走到了一半,这并不是那么困难,相当简单。

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

确保你有

像-javaagent:C:\aspectj1.8\lib\aspectjweaver.jar这样的javaagent中的

aspectjweaver.jar

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

这就是从Eclipse或某个IDE运行的全部内容

如果您想从命令行运行,请确保在命令行中也提供了-javagaent

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9235043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档