【发布时间】:2023-03-28 04:32:01
【问题描述】:
我正在尝试使用面向方面的编程来执行一个简单的斐波那契函数并跟踪对任何 除了Java中的方法之外,还显示嵌套 他们的水平。
Java 代码:
package tracing;
public class Test {
static int fib(int n) {
if (n<=1)
return n;
else
return fib(n-1) + fib(n-2);
}
static void report(int n,int r) {
System.out.println("fib("+n+")="+r);
}
public static void main(String[] a) {
report(4,fib(4));
}
}
AspectJ 代码:
package tracing;
public aspect Trace {
String prefix = "";
Object around(): call(* *(..)) && !within(java..*) && !within(FigureEditor..*) {
System.out.println(prefix+thisJoinPoint.getSignature());
prefix = ">" + prefix;
Object result = proceed();
prefix = prefix.substring(1);
return result;
}
}
注意:&& !within(FigureEditor..*) 仅用于避免不同包的类中的函数。
控制台输出 - 错误:
Exception in thread "main" java.lang.StackOverflowError at
org.aspectj.runtime.internal.AroundClosure.<init>(AroundClosure.java:34)
at tracing.Trace$AjcClosure1.<init>(Trace.aj:1) at
tracing.Trace.ajc$around$tracing_Trace$1$ef88057b(Trace.aj:7) at
tracing.Trace.ajc$around$tracing_Trace$1$ef88057b(Trace.aj:7) at
tracing.Trace.ajc$around$tracing_Trace$1$ef88057b(Trace.aj:7) at
tracing.Trace.ajc$around$tracing_Trace$1$ef88057b(Trace.aj:7) at
tracing.Trace.ajc$around$tracing_Trace$1$ef88057b(Trace.aj:7) at
tracing.Trace.ajc$around$tracing_Trace$1$ef88057b(Trace.aj:7)
更新:我想要的输出类似于下面:
void Test.main(String [])
>void Test.report(int, int)<br>
>>int Test.fib(int)<br>
>>>int Test.fib(int)<br>
>>>>int Test.fib(int)<br>
>>>>>int Test.fib(int)<br>
>>>>>int Test.fib(int)<br>
>>>>int Test.fib(int)<br>
>>>int Test.fib(int)<br>
>>>>int Test.fib(int)<br>
>>>>int Test.fib(int)<br>
>> void Test.write(String) fib(4)=3
【问题讨论】:
-
我已经修复了您的格式问题。代码格式的语法是缩进 4 个空格,您还应该将其用于控制台日志,而不是引用语法 ">"。
标签: java stack-overflow aop aspectj aspect