我在aspectJ中实现具体方面时遇到了问题。以下是相关的代码段。我有两个抽象的方面 - FieldAspect.java
和AbstractTracing.java
。我在xml中定义了具体方面 - ConcreteTracingimpl
和MyFieldAspect
,这不是代码。在Main.java
,我正在调用Test.getTestMethod()
,因此,在调用此方法之前,@method
已注释,around
中的AbstractTracing.java
建议已应用但{{1}还有一个用AbstractTracing.java
注释注释的静态字段,因此,该字段应使用值@field
进行初始化
但它是空的。
如果抽象方面包含带注释的字段,并且这些字段适用于加载时间编织,那么应该如何实现?请指导我。非常感谢。
AbstractTracing.java
andy
FieldAspect.java
package main.java.aop.extend;
import main.java.aop.field.Field;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;.
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public abstract class AbstractTracing {
@Field
static String x;
@Pointcut
public abstract void trace();
@Around("trace()")
public void traceMethod() {
System.out.println("In trace method of AbstractTracing class : " + x);
}
}
aop.xml文件
package main.java.aop.field;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public abstract class FieldAspect {
@Pointcut
public abstract void getField();
@Around("getField()")
public String getFieldValue() {
return "Andy";
}
}
Field.java
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<concrete-aspect name="main.java.aop.extend.ConcreteTracingimpl"
extends="main.java.aop.extend.AbstractTracing">
<pointcut name="trace"
expression="execution(@main.java.aop.method.Method * * (..))" />
</concrete-aspect>
<concrete-aspect name="main.java.aop.field.MyFieldAspect"
extends="main.java.aop.field.FieldAspect">
<pointcut name="getField" expression="get(@main.java.aop.field.Field * *)" />
</concrete-aspect>
<weaver options="-verbose -showWeaveInfo" />
</aspectj>
Method.java
package main.java.aop.field;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Field {
}
Main.java
package main.java.aop.field;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Method {
}
Test.java
package main.java.aop.main;
import main.java.aop.extend.Test;
public class Main {
public static void main(String[] args) {
System.out.println("<---------- EXTENDS example ---------->");
Test.testMethod();
}
}
答案 0 :(得分:1)
有趣的情况,看起来像是一个AspectJ错误。从我所看到的,抽象方面本身并没有被传递给编织者。我们可以看到,如果你在weaver选项中启用了额外的标志(-debug):
[AppClassLoader@58644d46] info AspectJ Weaver Version 1.8.4 built on Thursday Nov 6, 2014 at 20:19:21 GMT
[AppClassLoader@58644d46] info register classloader sun.misc.Launcher$AppClassLoader@58644d46
[AppClassLoader@58644d46] info using configuration /Users/aclement/play/sridhar/META-INF/aop.xml
[AppClassLoader@58644d46] info define aspect main.java.aop.extend.ConcreteTracingimpl
[AppClassLoader@58644d46] info define aspect main.java.aop.field.MyFieldAspect
[AppClassLoader@58644d46] debug weaving 'main.java.aop.extend.ConcreteTracingimpl'
[AppClassLoader@58644d46] debug generating class 'main.java.aop.extend.ConcreteTracingimpl'
[AppClassLoader@58644d46] debug weaving 'main.java.aop.field.MyFieldAspect'
[AppClassLoader@58644d46] debug generating class 'main.java.aop.field.MyFieldAspect'
[AppClassLoader@58644d46] debug weaving 'main.java.aop.main.Main'
[AppClassLoader@58644d46] weaveinfo Join point 'field-get(java.lang.String main.java.aop.extend.AbstractTracing.x)' in Type 'main.java.aop.main.Main' (Main.java:11) advised by around advice from 'main.java.aop.field.MyFieldAspect' (FieldAspect.java:7)
<---------- EXTENDS example ---------->
[AppClassLoader@58644d46] debug weaving 'main.java.aop.extend.Test'
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void main.java.aop.extend.Test.testMethod())' in Type 'main.java.aop.extend.Test' (Test.java:8) advised by around advice from 'main.java.aop.extend.ConcreteTracingimpl' (AbstractTracing.java)
[AppClassLoader@58644d46] debug generating class 'main.java.aop.extend.Test$AjcClosure1'
[AppClassLoader@58644d46] debug cannot weave 'org.aspectj.lang.NoAspectBoundException'
In trace method of AbstractTracing class : null
现在为什么它没有被传递给织布工,这是个好问题。可能正是这些重新入侵的守卫已经到位,以阻止织工进入自己曾经做过的事情。
但是,我已经改变了一些东西并且可以使它工作,我使用了一个隐藏在其中一个发布自述文件中的特殊功能。如果您拥有类似的方面,您可以在XML中实际定义整个方面,只需使用代码来保存行为,则不需要任何方面注释。所以,如果我像这样重写你的抽象方面:
package main.java.aop.field;
class FieldAspect {
static String getField() {
return "Andy";
}
}
package main.java.aop.extend;
public class AbstractTracing {
@Field
public static String x;
public static void traceMethod() {
System.out.println("In trace method of AbstractTracing class : " + x);
}
}
然后这个aop.xml:
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<concrete-aspect name="main.java.aop.field.MyFieldAspect">
<around pointcut="get(@main.java.aop.field.Field * *)" invokeClass="main.java.aop.field.FieldAspect" invokeMethod="getField()"/>
</concrete-aspect>
<concrete-aspect name="main.java.aop.extend.ConcreteTracingImpl">
<around pointcut="execution(@main.java.aop.method.Method * *(..))" invokeClass="main.java.aop.extend.AbstractTracing" invokeMethod="traceMethod()"/>
</concrete-aspect>
</aspects>
<weaver options="-verbose -showWeaveInfo" />
</aspectj>
(此功能的文档在此处:http://www.eclipse.org/aspectj/doc/released/README-1612.html)
现在我跑的时候
[AppClassLoader@58644d46] info AspectJ Weaver Version 1.8.4 built on Thursday Nov 6, 2014 at 20:19:21 GMT
[AppClassLoader@58644d46] info register classloader sun.misc.Launcher$AppClassLoader@58644d46
[AppClassLoader@58644d46] info using configuration /Users/aclement/play/sridhar/META-INF/aop.xml
[AppClassLoader@58644d46] info define aspect main.java.aop.field.MyFieldAspect
[AppClassLoader@58644d46] info define aspect main.java.aop.extend.ConcreteTracingImpl
<---------- EXTENDS example ---------->
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void main.java.aop.extend.Test.testMethod())' in Type 'main.java.aop.extend.Test' (Test.java:8) advised by around advice from 'main.java.aop.extend.ConcreteTracingImpl' (no debug info available)
[AppClassLoader@58644d46] weaveinfo Join point 'field-get(java.lang.String main.java.aop.extend.AbstractTracing.x)' in Type 'main.java.aop.extend.AbstractTracing' (AbstractTracing.java:13) advised by around advice from 'main.java.aop.field.MyFieldAspect' (no debug info available)
In trace method of AbstractTracing class : Andy
您可以在&#39;抽象方面看到加入点。这次正在编织。但是,你从XML指出的代码的约束(即方法需要是静态的) - 我不知道你是否可以接受?您发现的问题肯定是一个错误(请提出它),我只是提供这种表达方面的替代方法作为解决方法。