1. 程式人生 > >java自定義註釋及其信息提取

java自定義註釋及其信息提取

red href 5.5 imp bsp present getc string 註解

轉自:https://xuwenjin666.iteye.com/blog/1637247

1. 自定義註解

package cn.veji.hibernate.po;  
  
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
@Target(ElementType.METHOD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface Privilege { String[] value(); }

2. 使用自定義註解

package cn.veji.hibernate.po;  
  
package cn.veji.hibernate.po;  
  
public class TestPrivilege {  
  
    @Privilege( { "a" })  
    public void a() {  
    }  
  
    @Privilege( { "b" })  
    public void
b() { } @Privilege( { "c" }) public void c() { } }

3. 信息提取

package cn.veji.hibernate.po;  
  
package cn.veji.hibernate.test;  
  
import java.lang.annotation.Annotation;  
import java.lang.reflect.Method;  
import java.util.HashMap;  
import java.util.Map;  
  
import cn.veji.hibernate.po.Privilege; import cn.veji.hibernate.po.TestPrivilege; public class AnnotationUtil { public static AnnotationUtil anno = null; public static AnnotationUtil getInstance() { if (anno == null) { anno = new AnnotationUtil(); } return anno; } /** * 讀取註解值 * * @param annotationClasss 處理Annotation類名稱 * @param annotationField 處理Annotation類屬性名稱 * @param className 處理Annotation的使用類名稱 * @return * @throws Exception */ @SuppressWarnings("all") public Map<String, String> loadVlaue(Class annotationClasss, String annotationField, String className) throws Exception { System.out.println("處理Annotation類名稱 === "+annotationClasss.getName()); System.out.println("處理Annotation類屬性名稱 === "+annotationField); System.out.println("處理Annotation的調用類名稱 === "+className); Map<String, String> map = new HashMap<String, String>(); Method[] methods = Class.forName(className).getDeclaredMethods(); for (Method method : methods) { if (method.isAnnotationPresent(annotationClasss)) { Annotation p = method.getAnnotation(annotationClasss); Method m = p.getClass() .getDeclaredMethod(annotationField, null); String[] values = (String[]) m.invoke(p, null); for (String key : values) { System.out.println("註解值 === " + key); map.put(key, key); } } } System.out.println("map數量 === " + map.size()); return map; } public static void main(String[] args) throws Exception { AnnotationUtil.getInstance().loadVlaue(Privilege.class, "value", TestPrivilege.class.getName()); } }

4. 執行結果

處理Annotation類名稱  === cn.veji.hibernate.po.Privilege  
處理Annotation類屬性名稱  === value  
處理Annotation的調用類名稱  === cn.veji.hibernate.po.TestPrivilege  
註解值 === c  
註解值 === a  
註解值 === b  
map數量  === 3 

5. 補充

5.1.註解的定義:Java文件叫做Annotation,用@interface表示。

5.2.元註解:@interface上面按需要註解上一些東西,包括@Retention、@Target、@Document、@Inherited四種。

5.3.註解的保留策略:

  •   @Retention(RetentionPolicy.SOURCE) // 註解僅存在於源碼中,在class字節碼文件中不包含
  •   @Retention(RetentionPolicy.CLASS) // 默認的保留策略,註解會在class字節碼文件中存在,但運行時無法獲得
  •   @Retention(RetentionPolicy.RUNTIME) // 註解會在class字節碼文件中存在,在運行時可以通過反射獲取到

5.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.5.註解包含在javadoc中:

  •   @Documented

5.6.註解可以被繼承:

  •   @Inherited

5.7.註解解析器:用來解析自定義註解。

java自定義註釋及其信息提取