一、自定义注解
Java
@Target(value=ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface NotNull {
String message() default "";
}
Target,Retention是元注解,也就是注解的注解
Target:注解的范围,这里选ElementType.FIELD,表示作用在属性上。
Retention:注解的生命周期,RUNTIME代表编译,运行的时候注解都存在,能影响到程序的逻辑。
二、定义注解处理逻辑
Java
public class ParamsRequired {
public boolean validate() throws Exception {
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
NotNull notNull = field.getAnnotation(NotNull.class);
if (notNull != null) {
Method m = this.getClass().getMethod("get" + getMethodName(field.getName()));
Object obj=m.invoke(this);
if (obj==null) {
System.err.println(field.getName() +notNull.message());
//throw new NullPointerException(notNull.message());
}
}
}
return true;
}
/**
* 把一个字符串的第一个字母大写
*/
private String getMethodName(String fildeName) throws Exception {
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
}
三、使用注解
Java
public class Car extends ParamsRequired{
@NotNull(message="名称不能为空")
private String name;
@NotNull(message="价格不能为空")
private Double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
四、测试
Java
public class Test {
public static void main(String[] args) throws Exception {
Car car=new Car();
car.validate();
}
}
运行结果: