public @interface SuppressWarnings {
String[] value();
}
初學者困惑:這不是方法嗎?為什麼沒有方法體?如何使用?
這是註解的「屬性」(元素)聲明,而非方法。
default 指定:String[] value() default {}。// 註解定義
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnno {
String[] value() default {}; // 屬性名慣用 value
int count() default 1;
}
// 使用註解
@MyAnno(value = {"a", "b"}, count = 3)
public class Demo {}
// 若屬性名為 value 且為唯一屬性,可省略 "value ="
@MyAnno({"a", "b"})
public class Demo2 {}
MyAnno anno = Demo.class.getAnnotation(MyAnno.class);
String[] vals = anno.value(); // 返回 ["a", "b"]
int cnt = anno.count(); // 返回 3
| 特性 | 普通介面 | 註解介面 |
|---|---|---|
| 關鍵字 | interface | @interface |
| 方法體 | 可有默認方法/靜態方法 | 不可有方法體 |
| 屬性語法 | 無 | 無參有返回值的「方法」 |
| 繼承 | 支持多實現 | 隱式繼承 java.lang.annotation.Annotation,不可顯式繼承 |
註解屬性本質是「配置數據」,編譯器將其編入字節碼,運行期通過反射讀取驅動框架邏輯。