java 通过反射获取注解

使用反射获取某个类的注释、方法上的注释、属性上的注释。
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
  * 
  * @author 2014-11-10 下午01:54:48 
  * @version V1.0  
 */
@XmlRootElement(name="user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

  private String pwd;

  @XmlElement(name = "ID")
  private int id;
  
  @XmlAttribute
  @XmlElement
  private String name;
  
  /***
   *  1、获取属性上的指定类型的注释
   *  2、获取属性上的指定类型的注释的指定方法
   *  3、获取属性上的所有注释
   *  4、获取类上的所有注释
   *  5、获取方法上的所有注释
    * @author 2014-11-10 下午02:18:24
    * @param args 
   */
  @SuppressWarnings("rawtypes")
  public static void main(String[] args) {
    
    Field[] fields =  User.class.getDeclaredFields();
    
    for(Field f : fields){
      String filedName = f.getName();
      System.out.println("属性名称:【"+filedName+"】");

      //1、获取属性上的指定类型的注释
      Annotation annotation = f.getAnnotation(XmlElement.class);
      
      //有该类型的注释存在
      if (annotation!=null) {
        //强制转化为相应的注释	
        XmlElement xmlElement = (XmlElement)annotation;
        //3、获取属性上的指定类型的注释的指定方法
        //具体是不是默认值可以去查看源代码
        if (xmlElement.name().equals("##default")) {
          System.out.println("属性【"+filedName+"】注释使用的name是默认值: "+xmlElement.name());
        }else {
          System.out.println("属性【"+filedName+"】注释使用的name是自定义的值: "+xmlElement.name());
        }
      }

      //2、获取属性上的所有注释
      Annotation[] allAnnotations = f.getAnnotations();
      
      for(Annotation an : allAnnotations){
        
        Class annotationType = an.annotationType();
        
        System.out.println("属性【"+filedName+"】的注释类型有: " + annotationType);
      }
      System.out.println("----------华丽的分割线--------------");
    }
    
    //4、获取类上的所有注释
    Annotation[] classAnnotation = User.class.getAnnotations();
    
    for(Annotation cAnnotation : classAnnotation){
      Class annotationType =  cAnnotation.annotationType();
      System.out.println("User类上的注释有: " +annotationType);
    }
    
    System.out.println("----------华丽的分割线--------------");
    
    // 5、获取方法上的所有注释
    Method method;
    try {
      method = User.class.getMethod("setPwd",String.class);
      
      Annotation[] methodAnnotations = method.getAnnotations();

      for(Annotation me : methodAnnotations){
        Class annotationType =  me.annotationType();
        System.out.println("setPwd方法上的注释有: " + annotationType);
      }
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    }
  }

  @XmlElement
  public void setPwd(String pwd) {
    this.pwd = pwd;
  }

  public String getPwd() {
    return pwd;
  }
}

运行结果如下所示

属性名称:【pwd】
----------华丽的分割线--------------
属性名称:【id】
属性【id】注释使用的name是自定义的值: ID
属性【id】的注释类型有: interface javax.xml.bind.annotation.XmlElement
----------华丽的分割线--------------
属性名称:【name】
属性【name】注释使用的name是默认值: ##default
属性【name】的注释类型有: interface javax.xml.bind.annotation.XmlAttribute
属性【name】的注释类型有: interface javax.xml.bind.annotation.XmlElement
----------华丽的分割线--------------
User类上的注释有: interface javax.xml.bind.annotation.XmlAccessorType
User类上的注释有: interface javax.xml.bind.annotation.XmlRootElement
----------华丽的分割线--------------
setPwd方法上的注释有: interface javax.xml.bind.annotation.XmlElement

猜你喜欢

转载自blog.csdn.net/Asa_Prince/article/details/83016166
今日推荐