注解和反射是spring框架的基础机制。
注解可以运用在的方法或类上面的。其功能实现底层是反射。
那注解是怎么通过反射实现想要的功能的呢?
步骤说明如下
- 1 写一个注解@a
- 2 写一个实现方法b,实现以下
- 2.1 获取引用注解的对象的信息
- 2.2 获取注解
- 2.3 操作引用注解的对象信息和注解信息,实现自定义注解的具体功能逻辑 - 3 写业务代码,引用@a注解
代码示例:
1 写一个注解@a
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE,ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
int max() default 1;
int min() default 100;
}
2 写一个实现方法b,实现以下
public class checkTool {
// 这里的入参是引用注解的对象所属类对象
public static void checkNum(Object objec){
try {
// 获取对象
Class c=objec.getClass();
// 获取对象的所有成员变量
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
// 设置私有属性为可访问,否则,私有属性是不能被访问的
field.setAccessible(true);
// 判断当前属性上是否包含自定义的注解
if (field.isAnnotationPresent(MyAnnotation.class)) {
// 获得该属性上的注解信息
MyAnnotation myAnnotation=field.getAnnotation(MyAnnotation.class);
int max = myAnnotation.max();
int min = myAnnotation.min();
// 通过反射获取到引用注解的对象的值
int num = field.getInt(objec);
if(num>max){
throw new RuntimeException("超出范围了,装修不了~~");
}
if(num<min){
throw new RuntimeException("没得装修啊~~");
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
3 写业务代码,引用@a注解
class Home{
// 引用注解
@MyAnnotation(min=1,max=100)
private int area;
private String addr;
public Home(int area){
this.area=area;
}
}
写个入口运行如下
public class Main {
public static void main(String[]args) throws NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
Home home = new Home(-1);
// 对注解的实现校验。实际开发中不需要自己调用,过滤器/AOP会自动调用
checkTool.checkNum(home);
}