2015-10-23 2 views
3

Я в замешательстве, как @SuppressWarnings работает внутри. Если мы видим, исходный код этого, это то, что, как показано ниже:Как работает @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) Как только мы передаем «неиспользуемый» в качестве параметра, затмение перестает бросать предупреждение. Точно так же мы можем использовать «unchecked», «debrecation» и т. Д. Так как это работает? Я имею в виду, что у нас есть только метод с именем value() в @interface, а его тип возврата - 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 {}; 
} 
+0

Что касается ключевого слова вопроса, 'default' всегда было ключевым словом, поскольку оно используется в 'switch'. – RealSkeptic

+0

ya default всегда использовался в корпусе коммутатора. Что-то вроде, если оно не находит подходящего случая, переходит в значение по умолчанию. Но как это работает здесь. – Deca

+0

"и другие пользовательские аннотации"? '@ SuppressWarnings' не является аннотацией * custom *. Это из пакета 'java.lang', поэтому он не получает больше * ядра *, чем это. – Andreas

ответ

1

Аннотация не делает ничего. Это просто в исходном коде.

Компилятор Th Eclipse, когда он видит его в методе (или классе или конструкторе и т. Д.), Просто не испускает некоторых предупреждений, которые он обычно испускает, в зависимости от того, что находится в атрибуте value аннотаций.

почему имя метода является значение()

Потому что это то, что конструктор аннотаций выбрал в качестве имени атрибута. Его можно назвать чем угодно. Преимущество использования «значение» в качестве его имени является то, что она позволяет писать

@SuppressWarnings("unused") 

вместо того, чтобы написать

@SuppressWarnings(value = "unused") 

Относительно ключевого слова по умолчанию:

String message() default "My Default Message"; 

Это просто означает, что если вы явно не указали значение атрибута сообщения аннотации, его значение равно "My Default Message".

+0

Почему он не разработан как интерфейс маркера. Я имею в виду, что это не могло быть так, как мы объявляем его маркером и любое предупреждение указано в параметре, компилятор не бросает предупреждение. Я имею в виду, что мы могли бы уйти со значением(), не так ли? – Deca

+0

Ну, с одной стороны, интерфейс не может использоваться для аннотирования полей, методов и т. Д. И идея SuppressWarnings заключается в том, что вы можете передать любое значение, которое вы хотите, и компилятор может реализовать любые недопустимые проверки, которые он хочет. Я не уверен, что следую тому, что ты хочешь. –

+0

Я, вы поняли это правильно. Еще один вопрос, если мы видим, определение - это что-то вроде: String [] value(); в интерфейсе. Это означает что-то вроде метода. Value() возвращает массив строк. Но, используя аннотацию, мы передаем ее как параметры, что должно быть что-то вроде значения (String [] strArray). Это не ясно для меня, мы передаем параметры с аннотациями и передаем значение метода(). Но value() не принимает строку String [], вместо этого возвращает String []. – Deca

0

Вы задаете два отдельных вопроса. Я отвечу им отдельно.

Как только мы передадим «неиспользованный» в качестве параметра, затмение прекратит бросать предупреждение. Точно так же мы можем использовать «unchecked», «debrecation» и т. Д. Так как это работает?

@SuppressWarning - специальная аннотация, в которой компилятор java знает об этом. Когда компиляция компилирует классы и находит предупреждения, она смотрит, есть ли какие-либо аннотации @SuppressWarning на этот код, и если да, то какие предупреждения он должен подавлять. Существует сопоставление имен строк с предупреждениями компилятора, чтобы он знал, какие предупреждения не распечатывать.Вот список, который я нашел в другой SO вопрос:

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

Eclipse, постоянно компиляции кода на лету, так что будет видеть ваше @SuppressWarning и начать игнорируя предупреждение, когда перекомпиляция запускается (как правило, на экономии)

Когда-нибудь мы видим, что в некотором @interface есть значение по умолчанию, как указано ниже. Итак, что такое дефолт?

По умолчанию используется значение по умолчанию, если пользователь не указывает значение. Таким образом, в вашем примере вы можете указать сообщение, как это:

@MyInf(message="my custom message") 

Если вы не указали сообщение как @MyInf, то сообщение устанавливается на "My Default Message"

+0

Спасибо за ваш ответ. Но мне это не ясно, В сообщениях javac есть отображение имен строк, чтобы он знал, какие предупреждения не распечатывать. – Deca

Смежные вопросы