先盗个图表达下我的对知识的崇尚之情:
代码:
业务场景:假如我是卖水果的,我要描述某一种水果的信息,直接用一些注解作为水果特征属性进行描述
1.先定义三个注解类:水果颜色、水果名字、水果供应商
package com.yoyo.yotils.yoyo.annotation;
import java.lang.annotation.*;
/**
* 水果颜色注解
* @author yoyo
* @version $Id: FruitColor.java, v 0.1 2019年01月07日 10:52 yoyo Exp $
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
/**
* 颜色枚举
*/
enum Color{
BLUE, RED, GREEN
}
/**
* 颜色注解
* @return
*/
Color fruitColor() default Color.GREEN;
}
package com.yoyo.yotils.yoyo.annotation;
import java.lang.annotation.*;
/**
* 水果名称注解
* @author yoyo
* @version $Id: FruitName.java, v 0.1 2019年01月07日 10:49 yoyo Exp $
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
package com.yoyo.yotils.yoyo.annotation;
import java.lang.annotation.*;
/**
* 水果供应商注解
* @author yoyo
* @version $Id: FruitProvider.java, v 0.1 2019年01月07日 11:00 yoyo Exp $
*/
@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 "";
}
2.定义一种水果类:苹果,用自定义的注解描述:
package com.yoyo.yotils.yoyo.annotation.test;
import com.yoyo.yotils.yoyo.annotation.FruitColor;
import com.yoyo.yotils.yoyo.annotation.FruitName;
import com.yoyo.yotils.yoyo.annotation.FruitProvider;
/**
* 注解描述的苹果类
*
* @author yoyo
* @version $Id: Apple.java, v 0.1 2019年01月07日 11:08 yoyo Exp $
*/
public class Apple {
@FruitName("Apple")
private String appleName;
@FruitColor(fruitColor = FruitColor.Color.RED)
private String appleColor;
@FruitProvider(id = 1, name = "陕西红富士集团", address = "陕西省西安市未央区红富士大厦")
private String appleProvider;
}
3.获取注解的属性值(进行业务处理或参与数据库操作)
package com.yoyo.yotils.yoyo.annotation.test;
import com.yoyo.yotils.yoyo.annotation.*;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
/**
* 获取注解内容的测试类
* @author yoyo
* @version $Id: FruitInfoUtil.java, v 0.1 2019年01月07日 11:27 yoyo Exp $
*/
public class FruitInfoUtil {
public static void getFruitInfo(Class<?> clazz) {
String strFruitName = "水果名称:";
String strFruitColor = "水果颜色:";
StringBuilder strFruitProvider = new StringBuilder("水果供应商:");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(FruitName.class)) {
FruitName fruitName = field.getAnnotation(FruitName.class);
strFruitName = strFruitName + fruitName.value();
System.out.println(strFruitName);
} else if (field.isAnnotationPresent(FruitColor.class)) {
FruitColor fruitColor = field.getAnnotation(FruitColor.class);
strFruitColor = strFruitColor + fruitColor.fruitColor().name();
System.out.println(strFruitColor);
} else if (field.isAnnotationPresent(FruitProvider.class)) {
FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class);
strFruitProvider = strFruitProvider.append("供应商编号:").append(fruitProvider.id()).append(";供应商名称:").append(
fruitProvider.name()).append(";供应商地址:").append(fruitProvider.address());
System.out.println(strFruitProvider);
}
}
}
public static void main(String[] args) {
FruitInfoUtil.getFruitInfo(Apple.class);
//判断一个类是否有某个注解*****该工具类还有其他工具方法
Component annotation = AnnotationUtils.findAnnotation(Apple.class, Component.class);
if (annotation != null) {
System.out.println("Apple类的注解为Comment注解类,且注解值annotation = " + annotation.value());
}
}
}
执行main结果: