首页 > 代码库 > 18.3.2从Class上获取信息(注解)

18.3.2从Class上获取信息(注解)

package d18_3_1;
/**
 * Class类上所包含的注解
 * 
 * getAnnotation(Class annotationClass) 获取该元素上指定的类型的注解
 * getAnnotations():返回此元素上存在的所有注解
 * getDeclaredAnnotations():返回直接存在于此元素上的所有注解
 */
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;

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassInfo4 {

	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 = ClassInfo4.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 = ClassInfo4.class.getAnnotations();

		for (Annotation cAnnotation : classAnnotation) {
			Class annotationType = cAnnotation.annotationType();
			System.out.println("User类上的注解有: " + annotationType);
		}

		System.out.println("----------华丽的分割线--------------");

		// 5、获取方法上的所有注解
		Method method;
		try {
			method = ClassInfo4.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;
	}
}

  

18.3.2从Class上获取信息(注解)