如果您想使用 AJDT,请尝试使用 Kepler。 ;-)
顺便说一句,您是否使用 ajc(AspectJ 编译器)编译了方面和 Java 类?或者你想用 javac 编译它们?在这种情况下,您需要在运行时编织切面(LTW,加载时编织),并且需要编织代理 (-javaagent:path/to/aspectjweaver.jar) 以及 aop.xml 中的相应配置。在你告诉我你想做什么之后,我可以用一个具体的例子来更新这个答案。
更新:好的,我测试了你的方面。它包含一些语法错误和其他问题,例如
-
@Before("(execution(* *.*(..))") 中的数字括号不匹配。相反,它应该是@Before("execution(* *.*(..))")。
- 后抛注释错过了异常绑定。应该是
@AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "t")。
现在这是一个完全可测试的独立示例:
驱动程序应用:
class Application {
public static void main(String[] args) {
new Application().foo();
}
public void foo() {
try {
sayHello("world");
}
catch (Exception e) {
System.out.println("Caught exception: " + e);
}
}
public void sayHello(String recipient) {
System.out.println("Hello " + recipient + "!");
throw new RuntimeException("Oops!");
}
}
方面:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class LoggerAspect {
@Before("execution(* *.*(..))")
public void intercept(JoinPoint jp) {
System.out.println("before " + jp);
}
@After("execution(* *.*(..))")
public void afterReturning(JoinPoint jp) {
System.out.println("after " + jp);
}
@AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "t")
public void logException(JoinPoint jp, Exception t) {
System.out.println("throwing " + jp);
}
}
如何用ajc编译&运行:
假设您的源文件位于名为 src 的目录中,并且您希望类文件以 bin 结尾,那么您就是这样编译的:
ajc -sourceroots src -1.7 -d bin -cp aspectjrt.jar
现在运行应用程序:
java -cp bin;aspectjrt.jar Application
before execution(void Application.main(String[]))
before execution(void Application.foo())
before execution(void Application.sayHello(String))
Hello world!
after execution(void Application.sayHello(String))
throwing execution(void Application.sayHello(String))
Caught exception: java.lang.RuntimeException: Oops!
after execution(void Application.foo())
after execution(void Application.main(String[]))
如何用javac编译&用LTW运行:
你需要用调试符号编译(-g):
javac -g -cp aspectjrt.jar -d bin src\*.java
在运行程序之前,您需要在bin\META-INF\aop.xml(或aop-ajc.xml)下进行LTW 配置:
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<aspect name="LoggerAspect"/>
</aspects>
<weaver>
<include within="*"/>
</weaver>
</aspectj>
现在您可以使用编织代理运行应用程序:
java -javaagent:aspectjweaver.jar -cp bin Application
输出是一样的,但如果你想看到更多,你可以添加其他编织器选项,如
<weaver options="-verbose -showWeaveInfo">
这应该会产生以下输出:
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.main(java.lang.String[]))' in Type 'Application' (Application.java:3) advised by before advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.main(java.lang.String[]))' in Type 'Application' (Application.java:3) advised by after advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.main(java.lang.String[]))' in Type 'Application' (Application.java:3) advised by afterThrowing advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.foo())' in Type 'Application' (Application.java:8) advised by before advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.foo())' in Type 'Application' (Application.java:8) advised by after advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.foo())' in Type 'Application' (Application.java:8) advised by afterThrowing advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.sayHello(java.lang.String))' in Type 'Application' (Application.java:16) advised by before advice from 'LoggerAspect'(LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.sayHello(java.lang.String))' in Type 'Application' (Application.java:16) advised by after advice from 'LoggerAspect' (LoggerAspect.java)
[AppClassLoader@58644d46] weaveinfo Join point 'method-execution(void Application.sayHello(java.lang.String))' in Type 'Application' (Application.java:16) advised by afterThrowing advice from 'LoggerAspect' (LoggerAspect.java)
before execution(void Application.main(String[]))
before execution(void Application.foo())
before execution(void Application.sayHello(String))
Hello world!
after execution(void Application.sayHello(String))
throwing execution(void Application.sayHello(String))
Caught exception: java.lang.RuntimeException: Oops!
after execution(void Application.foo())
after execution(void Application.main(String[]))
如果您需要更多,也可以将 -debug 选项添加到编织器选项中。