注解如何生效
- 传入字节码对象,通过反射获取类, 字段, 方法上的注解对象
- 通过注解对象获取注解上的值
Car Info 注解
@Retention(RetentionPolicy.RUNTIME) // 在运行时仍然保留
@Target(ElementType.FIELD) // 在字段上使用注解
public @interface CarBrand { // 汽车品牌------注解①
String brand() default "";
}
--------------------------------------------------------------
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CarPrice { // 汽车价格------注解②
double price() default 0;
}
--------------------------------------------------------------
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CarColor { // 汽车颜色------注解③
enum color{BLACK, WHITE, RED, GREY};
color carColor() default color.BLACK;
}
Car 对象上使用注解
public class Car {
@CarBrand(brand = "BMW")
private String brand;
@CarPrice(price = 23333)
private double price;
@CarColor(carColor = CarColor.color.WHITE)
private String color;
public Car() {
}
public void run() {
System.out.println("a "+color+" "+brand+ " car is driving");
}
}
仅使用注解是无效的, 重要的是获取注解上的信息.
获取注解信息
public class CarInfoUtil {
public static Map getCarInfo(Class<?> clazz) {
String brand = ""; // 仅作声明用
double price = 0;
String color = "";
Field[] declaredFields = clazz.getDeclaredFields(); // 获得所有字段
for (Field f : declaredFields) {
if (f.isAnnotationPresent(CarBrand.class)) { // 如果当前的注解是参数中的类型
CarBrand carBrand = f.getAnnotation(CarBrand.class); // 获得注解
brand = carBrand.brand(); // 取值
}
if (f.isAnnotationPresent(CarPrice.class)) { // 同上
CarPrice carPrice = f.getAnnotation(CarPrice.class);
price = carPrice.price();
}
if (f.isAnnotationPresent(CarColor.class)) {
CarColor carColor = f.getAnnotation(CarColor.class);
color = carColor.carColor().toString();
}
}
Map carInfo = new HashMap();
carInfo.put("carBrand", brand);
carInfo.put("carPrice", price);
carInfo.put("carColor", color);
return carInfo;
}
}
使用注解信息
public class ResultTest {
private Car car;
@Before // 该注解表示在测试方法之前执行,可用于初始化spring容器
public void init() {
car = new Car();
Map carInfo = CarInfoUtil.getCarInfo(Car.class);
car.setBrand((String) carInfo.get("carBrand"));
car.setPrice((Double) carInfo.get("carPrice"));
car.setColor((String) carInfo.get("carColor"));
}
@Test
public void test1(){
car.run();
}
}
控制台输出:
a WHITE BMW car is driving
...
Tip:
使用注解时若只填写value()
方法的值时, 括号中可省略value =
, 直接写值; 除了value()
方法还有其他方法需要设置值,那么value =
不可省略,如:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CarBrand {
String value() default "";
String name() default "a";
}
那么可以这样写:
@CarBrand("BMW")
private String brand;
下面只能那样写:
@CarBrand(value = "BMW",name = "540i")
private String brand;
当然,首先得在注解中定义value()
方法.
网友评论