【java自定義註解1】java自定義註解-屬性
阿新 • • 發佈:2018-11-26
關於自定義註解,以前專案種應用的不多,最近看新專案過程中發現了挺多自定義註解相關內容,使用起來比較巧妙,於是
總結了兩種方式,記錄如下:
第一種:結合反射進行屬性注入,程式碼如下:
1、定義一個註解:
package com.xxx.ann.simple; import java.lang.annotation.*; /** * 1.註解的定義:Java檔案叫做Annotation,用@interface表示。 * * 2.元註解:@interface上面按需要註解上一些東西,包括@Retention、@Target、@Document、@Inherited四種。 * * 3.註解的保留策略: * * @Retention(RetentionPolicy.SOURCE) // 註解僅存在於原始碼中,在class位元組碼檔案中不包含 * * @Retention(RetentionPolicy.CLASS) // 預設的保留策略,註解會在class位元組碼檔案中存在,但執行時無法獲得 * * @Retention(RetentionPolicy.RUNTIME) // 註解會在class位元組碼檔案中存在,在執行時可以通過反射獲取到 * * 4.註解的作用目標: * * @Target(ElementType.TYPE) // 介面、類、列舉、註解 * * @Target(ElementType.FIELD) // 欄位、列舉的常量 * * @Target(ElementType.METHOD) // 方法 * * @Target(ElementType.PARAMETER) // 方法引數 * * @Target(ElementType.CONSTRUCTOR) // 建構函式 * * @Target(ElementType.LOCAL_VARIABLE) // 區域性變數 * * @Target(ElementType.ANNOTATION_TYPE) // 註解 * * @Target(ElementType.PACKAGE) // 包 * * 5.註解包含在javadoc中: * * @Documented * * 6.註解可以被繼承: * * @Inherited * * 7.註解解析器:用來解析自定義註解。 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyAnno { //註解的屬性 String name() default "rose"; String value() default "jack"; }
2、用於屬性:
/** * 一個屬性中使用了自定義註解的物件 */ public class Person { @MyAnno(name="tom") private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3、測試類與註解值得獲取:
/** * 測試類 * @param <T> */ public class TestClass<T> { /** * 主方法 * @param args */ public static void main(String[] args) { Person person = getPerson(Person.class); System.out.println(person.getName()); } /** * 通過反射獲取註解的值 * @param clz * @return */ public static Person getPerson(Class clz){ Person person =null; try { person = (Person)clz.newInstance(); //獲取屬性 Field[] fields = clz.getDeclaredFields(); for(Field field : fields){ //是否被特定註解修飾 boolean fieldHasAnno = field.isAnnotationPresent(MyAnno.class); if(fieldHasAnno){ MyAnno fieldAnno = field.getAnnotation(MyAnno.class); //注入註解屬性 String name = fieldAnno.name(); person.setName(name); } } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return person; } private T obj; public T getObj(){ return obj; } public TestClass(T obj) { this.obj = obj; } }
4、執行結果,是註解中的name屬性的值,測試完成。
tom