package com.mine.practice.reflectfield;
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
public static void main(String[] args) {
Field[] fields=AdmEvaluationitemEntity.class.getDeclaredFields();
for(Field field:fields){
//获得属性名
String name=field.getName();
System.out.print("属性名:"+name+" ");
//获得属性column的dataType;
Column col=field.getAnnotation(Column.class);
DataType d=col.dataType();
System.out.print("数据类型:"+d.name()+" ");
//获得column的name;
String tname=col.name();
System.out.print("column-name:"+tname+" ");
//获得id注释
Id id=field.getAnnotation(Id.class);
if(id!=null){
System.out.println("id:"+field.getName());
}else{
System.out.println();
}
}
//获得表名
Table t=AdmEvaluationitemEntity.class.getAnnotation(Table.class);
String n=t.name();
System.out.println("表名:"+n);
}
属性名:id 数据类型:STRING column-name:ID id:id
属性名:itemtype 数据类型:STRING column-name:itemType
属性名:itemname 数据类型:STRING column-name:itemName
属性名:description 数据类型:STRING column-name:description
属性名:weight 数据类型:DECIMAL column-name:weight
属性名:typeindex 数据类型:DECIMAL column-name:typeIndex
表名:ADM_EVALUATIONITEM