注解也是蛮有意思的。个人来看,它更多是一种偷懒的处理方法。一种常见的场景是这样的,如果我们希望对某一种类型的数据来做判断,那么就是在每个函数开始的位置添加各种各样的判断语句。如果数据比较少的话,尚可接受;但是数据一多,整个代码就显得非常臃肿。
下面,我们就通过一个简单的例子,看看注解如何使用,
1、定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Range{
int min() default 0;
int max() default 255;
}
注解的定义比较简单,只要看看@interface这个关键字在哪,@interface后面那个变量就是注解名。在它的上方有两个元注解,一个是@Retention,一个是@Target。Retention告诉编译器,这个Range是在系统运行的时候使用的。而Target告诉编译器,这个注解用于类变量来使用的。在Range注解中,定义了两个变量,一个是min,一个是max。min的默认数值是0,max默认是255。
2、注解使用
class Human{
@Range(min=1, max=20)
public String name;
@Range(max=10)
public String city;
}
注解的使用非常简单。既然前面谈到Range主要用于类变量,那么直接把Range添加到对应变量的头部就可以了。如果需要修改数值的话,重新设定min和max即可。
3、注解的分析和调用
public static boolean check(Human h){
for (Field field:h.getClass().getFields()){
Range r = field.getAnnotation(Range.class);
if(r != null){
try {
Object o = field.get(h);
if(o instanceof String){
String s = (String) o;
if(s.length() < r.min() || s.length() > r.max()){
return false;
}
}
}catch(IllegalAccessException ill){
return false;
}
}
}
return true;
}
public static void test10(){
Human h = new Human();
h.city = "yancheng";
h.name = "tom";
System.out.println(check(h));
}
如上面代码所示,有两个函数,一个是test10,一个是check。前者主要是创建一个human对象,赋值之后用check函数来判断city和name本身是否符合要求。
check函数中,首先还是通过getClass获得Class数据类型,进而通过getFields获取所有的类变量。关键的一步来了,这个时候可以通过getAnnotation获得注解Range。如果Range不为空的话,就可以通过field.get获得数据,将获得的数据与注解中的min、max进行判断,这样注解的功能不久可以实现了。
4、其他
当然注解的功能不止于此。大家在web开发中经常看到的controller注解也是一种场景。开发的时候灵活运用注解,有的时候确实可以帮助我们节省很多的工作量。代码看上去也清爽一些。
标签:web,java,String,min,max,Range,注解,check From: https://blog.51cto.com/feixiaoxing/5881295