通过@FruitName、@FruitColor、@FruitProvider三个自定义注解,演示获取字段上的注解信息
Apple
public class Apple {
@FruitName("Apple")
private String appleName;
@FruitColor(fruitColor= FruitColor.Color.RED)
private String appleColor;
@FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")
private String appleProvider;
public void setAppleColor(String appleColor) {
this.appleColor = appleColor;
}
public String getAppleColor() {
return appleColor;
}
public void setAppleName(String appleName) {
this.appleName = appleName;
}
public String getAppleName() {
return appleName;
}
public void setAppleProvider(String appleProvider) {
this.appleProvider = appleProvider;
}
public String getAppleProvider() {
return appleProvider;
}
}
@FruitName
/**
* 水果名称注解
* @author zhb
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
@FruitColor
/**
* 水果颜色注解
* @author zhb
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
/**
* 颜色枚举
*/
public enum Color{ BULE,RED,GREEN};
/**
* 颜色属性
* @return
*/
Color fruitColor() default Color.GREEN;
}
@FruitProvider
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
/**
* 供应商编号
* @return
*/
public int id() default -1;
/**
* 供应商名称
* @return
*/
public String name() default "";
/**
* 供应商地址
* @return
*/
public String address() default "";
}
FruitInfoUtil
public class FruitInfoUtil {
public static void getFruitInfo(Class<?> clazz) {
String strFruitName=" 水果名称:";
String strFruitColor=" 水果颜色:";
String strFruitProvicer="供应商信息:";
Field[] fields = clazz.getDeclaredFields();
for(Field field :fields){
if(field.isAnnotationPresent(FruitName.class)){
FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);
strFruitName=strFruitName+fruitName.value();
System.out.println(strFruitName);
}
else if(field.isAnnotationPresent(FruitColor.class)){
FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);
strFruitColor=strFruitColor+fruitColor.fruitColor().toString();
System.out.println(strFruitColor);
}
else if(field.isAnnotationPresent(FruitProvider.class)){
FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);
strFruitProvicer=strFruitProvicer+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address();
System.out.println(strFruitProvicer);
}
}
}
}
FruitRun 测试
public class FruitRun {
public static void main(String[] args){
FruitInfoUtil.getFruitInfo(Apple.class);
}
}
获取其他注解信息
总的来说,先获取到相应的对象,再获取注解实例,最后获取注解实例的属性。
通过getAnnotation(XXXAnnotation.class)方法,获取具体的注解实例
//获取类对象
Class<TestAnnotation> clazz = TestAnnotation.class;
//获取构造方法对象
Constructor<TestAnnotation> constructors = clazz.getConstructor(new Class[] {});
//获取方法对象,new Class[] { String.class }表示方法的参数
Method method = clazz.getMethod("setId", new Class[] { String.class });
//获取字段对象
Field field = clazz.getDeclaredField("id");