自定義注解:使用@interface自定義注解時,自動繼承了java.lang.annotation接口刻像,由編譯程序自動完成其他細節(jié)。
? ? ? ? ? ? ? ? ? ? ? 在定義注解時短荐,不能繼承其他的注解或接口倚舀。
@interface 用來聲明一個注解叹哭,其中的每一個方法實際上是聲明了一個配置參數(shù)。方法的名稱就是參數(shù)的名稱痕貌,返回值類型就
是參數(shù)的類型(返回值類型只能是基本類型风罩、class、String舵稠、enum)超升。
定義注解格式: public @interface 注解名 {定義體}
注解參數(shù)的可支持數(shù)據(jù)類型:
? ? 1、八種基本數(shù)據(jù)類型(byte,short,int,long,float,double,char,boolean)
? ? 2哺徊、String類型
? ? 3室琢、enum類型
? ? 4、Annotation類型
? ? 5落追、Class類型
? ? 6研乒、以上所有類型的數(shù)組
? ? Annotation類型里面的參數(shù)該怎么設(shè)定:
? ? 第一、只能用public或默認(default)這個兩個訪問權(quán)修飾淋硝,例如,String value();這里把方法設(shè)為default默認類型宽菜;
? ? 第二谣膳、參數(shù)成員只能用基本類型byte,short,int,long,char,float,double,boolean八種基本數(shù)據(jù)類型和String,enum,class,annotation等數(shù)據(jù)類型铅乡,
? ? ? ? ? ? ? ? 已經(jīng)這些類型的數(shù)組继谚。例如,String value()阵幸;這里的參數(shù)成員就為String;
? ? 第三花履、如果只有一個參數(shù)成員,最好把參數(shù)名稱設(shè)為“value”,后加小括號
實例:
? ??????????????????????package annotation;
????????????????????????import java.lang.annotation.Documented;
????????????????????????import java.lang.annotation.ElementType;
? ? ? ? ? ? ? ? ? ? ? ? import java.lang.annotation.Retention;
????????????????????????import java.lang.annotation.RetentionPolicy;
????????????????????????import java.lang.annotation.Target;
????????????????????????/**
????????????????????????* 水果名稱注解
????????????????????????* @author peida
????????????????????????*
????????????????????????*/
????????????????????????@Target(ElementType.FIELD)
????????????????????????@Retention(RetentionPolicy.RUNTIME)
????????????????????????@Documented
????????????????????????public @interface FruitName {
? ? ????????????????????????????String value() default "";
? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ??注解元素的默認值:
注解元素必須有確定的值挚赊,要么在定義注解的默認值中指定诡壁,要么在使用注解時指定,非基本類型的注解元素的值不可為null荠割。因此, 使用空字符串或0作為默認值是一種常用的做法妹卿。這個約束使得處理器很難表現(xiàn)一個元素的存在或缺失的狀態(tài),因為每個注解的聲明中蔑鹦,所有元素都存在夺克,并且都具有相應(yīng)的值,為了繞開這個約束嚎朽,我們只能定義一些特殊的值铺纽,例如空字符串或者負數(shù),一次表示某個元素不存在哟忍,在定義注解時狡门,這已經(jīng)成為一個習(xí)慣用法陷寝。例如:
package annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果供應(yīng)者注解
* @author peida
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
? ? /**
? ? * 供應(yīng)商編號
? ? * @return
? ? */
? ? public int id() default -1;
? ? /**
? ? * 供應(yīng)商名稱
? ? * @return
? ? */
? ? public String name() default "";
? ? /**
? ? * 供應(yīng)商地址
? ? * @return
? ? */
? ? public String address() default "";
}