Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AspectJ在跟踪源文件中的注释时出错_Java_Aspectj_Aspect - Fatal编程技术网

Java AspectJ在跟踪源文件中的注释时出错

Java AspectJ在跟踪源文件中的注释时出错,java,aspectj,aspect,Java,Aspectj,Aspect,我有这样一个方面代码: package aspects; import java.util.logging.Level; import java.util.logging.Logger; import org.aspectj.lang.Signature; import org.junit.Test; public aspect TestCaseTrace{ // pointcut traceTestCase() : (execution(public * test*(.

我有这样一个方面代码:

package aspects;
 
import java.util.logging.Level;
import java.util.logging.Logger;
 
import org.aspectj.lang.Signature;
import org.junit.Test;
 
public aspect TestCaseTrace{
 
    // pointcut traceTestCase() : (execution(public * test*(..)));
 
    pointcut traceTestCase() : (execution(@Test * *(..)));

    before(): traceTestCase(){
        String sourceName = thisJoinPointStaticPart.getSourceLocation().getWithinType().getCanonicalName();
        Signature sig = thisJoinPointStaticPart.getSignature();
        System.out.println("Test case name is " + sig.getDeclaringTypeName() + "." + sig.getName() + "\n\n");
    }

    after(): traceTestCase(){
    // Logger.getLogger("Tracing").log(Level.INFO,"Test case got over\n\n");
        System.out.println("Test case got over\n\n");
    }
}
TestCaseTrace.java:13 [error] annotation type patterns are only supported at Java 5 compliance level or above
pointcut traceTestCase() : (execution(@Test * *(..)));
                                      

1 error
我试图在上面的代码中跟踪junit
@Test
。在编译方面时,使用以下命令:

ajc -classpath aspectjrt.jar:junit-4.10.jar  -outxml -outjar aspects.jar  TestCaseTrace.java
但此命令会产生如下错误:

package aspects;
 
import java.util.logging.Level;
import java.util.logging.Logger;
 
import org.aspectj.lang.Signature;
import org.junit.Test;
 
public aspect TestCaseTrace{
 
    // pointcut traceTestCase() : (execution(public * test*(..)));
 
    pointcut traceTestCase() : (execution(@Test * *(..)));

    before(): traceTestCase(){
        String sourceName = thisJoinPointStaticPart.getSourceLocation().getWithinType().getCanonicalName();
        Signature sig = thisJoinPointStaticPart.getSignature();
        System.out.println("Test case name is " + sig.getDeclaringTypeName() + "." + sig.getName() + "\n\n");
    }

    after(): traceTestCase(){
    // Logger.getLogger("Tracing").log(Level.INFO,"Test case got over\n\n");
        System.out.println("Test case got over\n\n");
    }
}
TestCaseTrace.java:13 [error] annotation type patterns are only supported at Java 5 compliance level or above
pointcut traceTestCase() : (execution(@Test * *(..)));
                                      

1 error
我在哪里犯了错误

使用的Java版本为1.7,aspect版本为1.8.6

编辑: 在遵循答案之后,我可以编译带有警告的代码。但在此之后,如果我使用生成的
aspect.jar
检查junit测试用例:

import org.junit.Test;
class HelloWorldApp {

    @Test
    public void testSome()
    {
        A.methodA();
    }

}


class A{
    public static void methodA()
    {
        methodB();
    }

    public static void methodB()
    {

    }
}
并使用命令行运行:

java -javaagent:aspectjweaver.jar -cp aspects.jar:. HelloWorldApp

没有打印任何内容。

AspectJ编译器的默认符合性级别独立于Java运行时的版本。默认值(ajc)为Java 1.4,具体如下:

将合规性级别设置为1.4(默认值),这意味着-源1.4和-目标1.2

因此,如果您需要更高的遵从性版本,则需要在调用
ajc
时明确指定版本:

ajc -classpath aspectjrt.jar:junit-4.10.jar -1.5 -outxml -outjar aspects.jar  TestCaseTrace.java
                                            ^^^^ you need this

它给出了一些其他警告,如:
TestCaseTrace.java:21[warning]在aspects.TestCaseTrace中定义的建议尚未应用[Xlint:adviceDidNotMatch]TestCaseTrace.java:15[warning]在aspects.TestCaseTrace中定义的建议尚未应用[Xlint:advicednotmatch]
@batman,这意味着切入点从未匹配过。由于您没有任何
-inpath
(或
-injar
)规范,我希望(没有要处理的文件)。我已经编辑了这个问题,您能帮我找到哪里出错了吗?