我正在使用AspectJ来监视字段访问和字段修改.我有一个gradle项目,它编译了两个方面,并使用gradle shadow插件将jar与aspectjrt和aspectjweaver打包在一个带阴影的jar中.代理仍然是org.aspectj.weaver.loadtime.Agent.一切正常,但当我尝试重新定位aspectj包时,我得到一个错误.
shadow插件配置是:
shadowJar {
relocate 'org.aspectj', 'shadow.org.aspectj'
relocate 'aj.org.objectweb.asm', 'shadow.aj.org.objectweb.asm'
}
Run Code Online (Sandbox Code Playgroud)
清单:
jar {
manifest {
attributes("Premain-Class": "shadow.org.aspectj.weaver.loadtime.Agent",
"Can-Redefine-Classes": true,
"Can-Retransform-Classes":true)
}
}
Run Code Online (Sandbox Code Playgroud)
这是反编译的方面类,所以看起来是正确的:
package com.vfunction.singletonanalysis;
import shadow.org.aspectj.lang.JoinPoint;
import shadow.org.aspectj.lang.NoAspectBoundException;
import shadow.org.aspectj.lang.annotation.Aspect;
import shadow.org.aspectj.lang.annotation.Before;
@Aspect
public class StaticFieldBeforeAccessAspect extends AbstractFieldAccessAspect {
public StaticFieldBeforeAccessAspect() {
}
@Before("callAt()")
public void before(JoinPoint joinPoint) throws Throwable {
this.printJoinPoint(joinPoint);
}
public static StaticFieldBeforeAccessAspect aspectOf() {
if (ajc$perSingletonInstance == null) {
throw new NoAspectBoundException("com.vfunction.singletonanalysis.StaticFieldBeforeAccessAspect", ajc$initFailureCause);
} else {
return ajc$perSingletonInstance;
}
}
public static boolean …Run Code Online (Sandbox Code Playgroud) 这是一个更为常见的问题:我使用的是xstream和woodstox,woodstox附带了一个服务提供程序,用于注册com.ctc.wstx.stax.WstxOutputFactory的woodstox jar中的javax.xml.stream.XMLOutputFactory.我想提供自己的javax.xml.stream.XMLOutputFactory,并且在类路径中仍然有woodstox jar.我知道我可以提供我自己的系统属性javax.xml.stream.XMLOutputFactory,但我正试图从我们的开发团队中解脱麻烦,并在我的jar中使用服务文件或者在我的战争中使用META -INF/services文件夹.查看javax.xml.stream.FactoryFinder的代码如何确保我的META-INF/services/javax.xml.stream.XMLOutputFactory文件将是FactoryFinder使用的文件?
我们使用xstream和camel,但找不到将工厂注入XStreamDataFormat的方法
我正在尝试使用访问者 API 通过 ASM 6 实现一些类转换。我需要知道某个字段是否具有特定的访问标志。例如,字段可以是 ACC_PUBLIC + ACC_STATIC。在visitField方法中,访问标志是9。那么我如何知道该字段是否是静态的?
谢谢