注解是jdk5.0的时候引入进来的,注解一般结合反射进行逻辑处理,使用@interface关键字定义。
注解的作用:例如自定义注解+拦截器实现登录校验,自定义注解+AOP实现日志打印等等。
下面是一个自定义注解结合反射的简单Demo:
名字自定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Name {
public String value() default "";
}
性别自定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Sex {
public enum GenderType {
Male("男"),
Female("女");
private String genderStr;
private GenderType(String arg0) {
this.genderStr = arg0;
}
@Override
public String toString() {
return genderStr;
}
}
GenderType gender() default GenderType.Male;
}
对象类:
public class Person {
@Name(value = "eagle")
public String name;
public String age;
@Sex(gender = Sex.GenderType.Male)
public String sex;
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
调用验证注解工具类:
public class AnnotionUtils {
public static String getInfo(Class<?> cs) {
String result = "";
Field[] declaredFields = cs.getDeclaredFields();
for (Field field : declaredFields) {
if (field.isAnnotationPresent(Name.class)) {
Name annotation = field.getAnnotation(Name.class);
String value = annotation.value();
result += (field.getName() + ":" + value + "\n");
}
if (field.isAnnotationPresent(Sex.class)) {
Sex annotation = field.getAnnotation(Sex.class);
String value = annotation.gender().name();
result += (field.getName() + ":" + value + "\n");
}
}
return result;
}
public static void main(String[] args){
String info = getInfo(Person.class);
System.out.println(info);
}
}
结果展示:
至于自定义注解+拦截器实现登录校验,自定义注解+AOP实现日志打印可以学习这里:Java自定义注解及使用场景