Sha*_*938 13 java aspectj javaagents
我正在使用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 hasAspect() {
return ajc$perSingletonInstance != null;
}
static {
try {
ajc$postClinit();
} catch (Throwable var1) {
ajc$initFailureCause = var1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是在尝试运行测试程序时仍然会出现错误,说找到的类型不是方面:
[AppClassLoader@18b4aac2] info AspectJ Weaver Version 1.8.12 built on Friday Oct 20, 2017 at 21:58:11 GMT
[AppClassLoader@18b4aac2] info register classloader sun.misc.Launcher$AppClassLoader@18b4aac2
[AppClassLoader@18b4aac2] info using configuration file:***/workspace/singleton-analysis/agent/build/libs/agent-1.0.0-SNAPSHOT-all.jar!/META-INF/aop.xml
[AppClassLoader@18b4aac2] info register aspect com.vfunction.singletonanalysis.StaticFieldModifyAspect
[AppClassLoader@18b4aac2] error The specified aspect 'com.vfunction.singletonanalysis.StaticFieldModifyAspect' cannot be found
[AppClassLoader@18b4aac2] info register aspect com.vfunction.singletonanalysis.StaticFieldAccessAspect
[AppClassLoader@18b4aac2] error The specified aspect 'com.vfunction.singletonanalysis.StaticFieldAccessAspect' cannot be found
[AppClassLoader@18b4aac2] info register aspect com.vfunction.singletonanalysis.StaticFieldBeforeAccessAspect
[AppClassLoader@18b4aac2] error Cannot register 'com.vfunction.singletonanalysis.StaticFieldBeforeAccessAspect' because the type found with that name is not an aspect
Run Code Online (Sandbox Code Playgroud)
检查aop.xml阴影罐子内的内容物。方面类名称是否被隐藏?我怀疑它没有给出错误消息。
正如文档中提到的,您可以让 Shadow 插件转换 XML 文件,如下所示:
shadowJar {
tranform(XmlAppendingTransformer.class) {
resource = 'aop.xml'
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |