跟踪注释的工作原理 - 针对注释执行的代码?

时间:2016-05-07 16:15:44

标签: java annotations

我想知道是否可以调试/查看控件的流程,以便为注释执行哪些代码。我想要了解的内容如下:

(不是特定于Spring Framework注释,可以是任何其他注释)

考虑代码段:

@Autowired(required=true)
private JPADBAccess jPADBAccess;

现在我想了解针对注释执行的操作/代码是什么?有可能看到。

我很难理解简单的注释是如何完成工作的;应该有一些代码可以实际做一些工作;注释就像接口(@interface ..),但实际工作的代码在哪里?

2 个答案:

答案 0 :(得分:1)

如果您正在处理开源库,您可以查看源代码并搜索注释的使用位置。

如果您想查看注释的实际使用方式,调试也可能有效。

对于运行时注释,您可以尝试调试应用程序并在类getAnnotationgetDeclaredAnnotations等类方法上设置断点。如果您的调试器支持它(就像Eclipse中那样),那么你也可以使用条件断点来例如如果getAnnotation的参数具有正确的类型,则仅在断点处停止。

如果在编译时处理注释,这将无法工作。在这种情况下,您可以通过debugging the annotation processor尝试相同的方法,并在加载注释的方法中设置断点。

答案 1 :(得分:0)

注释的“范围”基于其位置。例如,此注释会影响整个类:

@SuppressWarnings("unused")
public class Foo{
    private Object anUnusedField;
    private Object anotherUnusedField;
    private void anUnusedMethod(Object unusedParameter){}
    /*
     * Here, the compiler will suppress all "the private field/method
     * Foo.[insert name here] is unused" warnings. It will warn about
     * the unusedParameter of anUnusedMethod
     */
}

这个影响特定领域:

public class Foo{
    private Object anUnusedField;
    @SuppressWarnings("unused") private Object anotherUnusedField;
    private void anUnusedMethod(Object unusedParameter){}
    /*
     * Here, the compiler won't tell that anotherUnusedField is not used.
     * But it'll tell that anUnusedField isn't used, anUnusedMethod isn't
     * called and unusedParameter isn't used in anUnusedMethod
     */
}

这个影响特定方法:

public class DifferentFoo{
    @SuppressWarnings("unused") private void anUnusedMethod(){}
    private void anotherUnusedMethod(){}
    /*
     * Here, the compiler will only tell that anotherUnusedMethod isn't
     * called
     */
}

另请注意,您不能对所有内容使用所有注释,例如以下内容无效:

@Override protected Object someFieldFromTheSuperclass;
// Doesn't compile. Fields can't be overriden like methods