如何使用自定義註解。
阿新 • • 發佈:2019-02-02
Java註解目前廣泛被應用。spring中的基於註解的依賴注入、Spring Web MVC中的Route、PlayFramework中的基於註解的Validation等。
使用註解,可以在適當地方替代XML的繁瑣。
現在來看看,如何自定義註解。
目標:通過註解方式,定義屬性的預設值。例如:
- publicclass DefaultUse {
- @Default(value = "Hello Annotation")
- private String msg;
- publicvoid say(){
-
System.out.println(msg);
- }
- }
一、新建Annotation
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- * @Retention 指定註釋的生存時期
- * CLASS:註釋記錄在類檔案中,但在執行時 VM 不需要保留註釋。
-
* RUNTIME:註釋記錄在類檔案中,在執行時 VM 將保留註釋,因此可以使用反射機制讀取註釋內容。
- * SOURCE:編譯器要丟棄的註釋。
- */
- @Retention(RetentionPolicy.RUNTIME)
- /**
- * @Target
- * 指示註釋型別所適用的程式元素的種類,如果註釋型別宣告中不存在 Target 元註釋,
- * 則宣告的型別可以用在任一程式元素上。
- * ElementType.ANNOTATION_TYPE:註釋型別宣告
- * ElementType.CONSTRUCTOR:構造方法宣告
- * ElementType.FILED:欄位宣告
- * ElementType.LOCAL_VARIABLE:區域性變數宣告
-
* ElementType.METHOD:方法宣告
- * ElementType.PACKAGE:包宣告
- * ElementType.PARAMETER:引數宣告
- * ElementType.TYPE:類、藉口或列舉宣告
- */
- @Target(ElementType.FIELD)
- public@interface Default {
- String value(); //預設值
- }
二、實際類中使用
- publicclass DefaultUse {
- @Default(value = "Hello Annotation")
- private String msg;
- publicvoid setMsg(String msg) {
- this.msg = msg;
- }
- publicvoid say(){
- System.out.println(msg);
- }
- }
三、註解解析過程
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- publicclass DefaultTest {
- publicstaticvoid main(String args[]) throws Exception{
- DefaultUse use = new DefaultUse();
- //Default註解的處理過程
- //這裡使用反射機制完成預設值的設定
- Field[] fileds = use.getClass().getDeclaredFields();
- for(Field filed : fileds){
- Default annotation = filed.getAnnotation(Default.class);
- if(annotation != null){
- PropertyDescriptor pd = new PropertyDescriptor(filed.getName(), DefaultUse.class);
- Method setterName = pd.getWriteMethod();
- if(setterName!=null){
- String value = annotation.value();
- filed.setAccessible(true);
- setterName.invoke(use, value);
- }
- }
- }
- use.say();
- }
- }