1. 程式人生 > >自定義 Java Annotation ,讀取註解值

自定義 Java Annotation ,讀取註解值

sta tools stp exc num value mage test lang

1. 首先是自定義註解:

Java代碼 技術分享
  1. package cn.veji.hibernate.po;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Target(ElementType.METHOD)
  7. @Retention(RetentionPolicy.RUNTIME)
  8. public @interface Privilege {
  9. String[] value();
  10. }





2.定義使用註解類:

Java代碼 技術分享
  1. package cn.veji.hibernate.po;
  2. package cn.veji.hibernate.po;
  3. public class TestPrivilege {
  4. @Privilege( { "a" })
  5. public void a() {
  6. }
  7. @Privilege( { "b" })
  8. public void b() {
  9. }
  10. @Privilege( { "c" })
  11. public void c() {
  12. }
  13. }




3.讀取註解值幫助類:

Java代碼 技術分享
  1. package cn.veji.hibernate.po;
  2. package cn.veji.hibernate.test;
  3. import java.lang.annotation.Annotation;
  4. import java.lang.reflect.Method;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import cn.veji.hibernate.po.Privilege;
  8. import cn.veji.hibernate.po.TestPrivilege;
  9. public class AnnotationUtil {
  10. public static AnnotationUtil anno = null;
  11. public static AnnotationUtil getInstance() {
  12. if (anno == null) {
  13. anno = new AnnotationUtil();
  14. }
  15. return anno;
  16. }
  17. /**
  18. * 讀取註解值
  19. *
  20. * @param annotationClasss 處理Annotation類名稱
  21. * @param annotationField 處理Annotation類屬性名稱
  22. * @param className 處理Annotation的使用類名稱
  23. * @return
  24. * @throws Exception
  25. */
  26. @SuppressWarnings("all")
  27. public Map<String, String> loadVlaue(Class annotationClasss,
  28. String annotationField, String className) throws Exception {
  29. System.out.println("處理Annotation類名稱 === "+annotationClasss.getName());
  30. System.out.println("處理Annotation類屬性名稱 === "+annotationField);
  31. System.out.println("處理Annotation的調用類名稱 === "+className);
  32. Map<String, String> map = new HashMap<String, String>();
  33. Method[] methods = Class.forName(className).getDeclaredMethods();
  34. for (Method method : methods) {
  35. if (method.isAnnotationPresent(annotationClasss)) {
  36. Annotation p = method.getAnnotation(annotationClasss);
  37. Method m = p.getClass()
  38. .getDeclaredMethod(annotationField, null);
  39. String[] values = (String[]) m.invoke(p, null);
  40. for (String key : values) {
  41. System.out.println("註解值 === " + key);
  42. map.put(key, key);
  43. }
  44. }
  45. }
  46. System.out.println("map數量 === " + map.size());
  47. return map;
  48. }
  49. public static void main(String[] args) throws Exception {
  50. AnnotationUtil.getInstance().loadVlaue(Privilege.class, "value",
  51. TestPrivilege.class.getName());
  52. }
  53. }




4.執行結果:

Java代碼 技術分享
    1. 處理Annotation類名稱 === cn.veji.hibernate.po.Privilege
    2. 處理Annotation類屬性名稱 === value
    3. 處理Annotation的調用類名稱 === cn.veji.hibernate.po.TestPrivilege
    4. 註解值 === c
    5. 註解值 === a
    6. 註解值 === b
    7. map數量 === 3

自定義 Java Annotation ,讀取註解值