@SuppressWarnings和其他自定义注释如何在内部工作?

时间:2015-10-23 18:04:25

标签: java annotations

我很困惑@SuppressWarnings如何在内部运作。如果我们看到它的源代码,它就是如下:

@Retention(SOURCE)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface SuppressWarnings
{
  String[] value();
}

现在,如果我们看到它在代码中实现,那就像是,

@SuppressWarnings({"unused"})
public static void main(String args[]){
int i;
}

所以问题是: -

1)一旦我们将“unused”作为参数传递,eclipse就会停止投掷警告。同样,我们可以使用“未选中”,“弃用”等。那么它是如何工作的?我的意思是我们在@interface中只有一个名为value()的方法,它的返回类型是String []。所以它做了一切,怎么样?为什么方法的名称是value()?这种方法是否具有某些特殊意义,它在内部执行某些操作以捕获“未使用”等参数?

2)有时候我们可以看到@interface中的默认值如下所示。那么默认是什么?从java8我们有一个新的默认方法概念。但是这个默认值也用在较低版本的java中。这是如何工作的,它是什么?这是一个低于java8版本的关键字吗?

public @interface MyIntf{

    /**
     * The error message.
     */
    String message() default "My Default Message";

    /**
     * The group.
     */
    Class<?>[] groups() default {};

    /**
     * the payload.
     */
    Class<? extends Payload>[] payload() default {};
}

2 个答案:

答案 0 :(得分:1)

注释没有做任何事情。它就在源代码中。

Eclipse编译器,当它在方法(或类或构造函数等)上看到它时,根本不会发出它通常会发出的一些警告,具体取决于{{1注释的属性。

  

为什么方法的名称是value()

因为注释的设计者选择了属性名称。它可以被命名为任何东西。使用&#34;值&#34;的优势正如它的名字一样,它允许写作

value

而不必写

@SuppressWarnings("unused")

关于默认关键字:

@SuppressWarnings(value = "unused")

这仅表示如果您没有明确指定注释的消息属性的值,则其值为String message() default "My Default Message";

答案 1 :(得分:0)

你问的是两个不同的问题。我会单独回答。

  

一旦我们通过&#34;未使用&#34;作为一个参数,日食停止投掷警告。同样,我们可以使用&#34;未选中&#34;,&#34;弃用&#34;那么它是如何工作的?

"My Default Message"是一个特殊的注释,因为java编译器知道它。当编译编译类并发现警告时,它会查看该代码上是否有任何@SuppressWarning注释,如果是,那么它应该抑制什么警告。有一个字符串名称到编译器警告的映射,因此它知道哪些警告不打印出来。这是我在另一个SO问题中找到的列表:

What is the list of valid @SuppressWarnings warning names in Java?

Eclipse会不断编译您的代码,因此它会看到您的@SuppressWarning并在触发重新编译时开始忽略警告(通常在保存时)

  

有时候我们可以看到@interface中的默认值如下所示。那么默认是什么?

默认值是用户未指定值的默认值。因此,在您的示例中,您可以指定如下消息:

@SuppressWarning

如果您没有指定@MyInf(message="my custom message") 之类的邮件,则邮件设置为@MyInf