天天看点

注解自定义以及解析

如何定义一个注解

public @interface 自定义注解名称 {

}
           

上面就是一个注解的定义,并且我们可以创建一个测试类,看看我们写的注解能不能加上去,发现没毛病

public class MyMethods {
    @MyAnno()
    private void method(){
        System.out.println("方法四执行了");
    }
}
           

我们接着学习有关注解的其他内容。

我们发现注解定义的时候不就是一个接口吗?,所以我们试着往里面加一些抽象方法

public @interface MyAnno {
    public abstract String state();
}
           

下面我们扩展一些,关于注解定义的抽象方法的重写

public @interface MyAnno {
    public abstract String state() default "关闭";
}
           

没错,就是这么简单,我们直接把方法后面加上 default 关键字,后面跟上返回值就可以了

再次给上面的方法加注解时候,括号中会提示默认 关闭 字符串

当然我们可以给注解加上注解,来完成一些特殊的设置,比如说

@Target()用于声明自定义注解可以加在什么地方,常用的参数有

ElementType.METHOD//可以放在方法上
ElementType.FIELD//可以加在成员变量上面
ElementType.TYPE//可以加载类上
           

下面这个用于设置 注解的生命周期,即使什么时候这个注解起作用

解析注解

注解通常和反射一起使用是框架技术的灵魂

笔者认为解析注解有这么几个功能比较常用

  1. 获得加注解的部分–谁被加了注解
  2. 获得注解中的参数

案例

把上面的代码进行改进。

  1. 自定义一个注解,只能加在方法上面
  2. 自定义注解的生命周期注意设置为运行时
  3. 为被添加注解的类添加四个方法
  4. 创建主方法
  5. 获得被加注解的方法
  6. 根据注解的值来运行方法

注解部分

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})//修饰类和方法
public @interface MyAnno {
    public abstract String state() default "关闭";
}
           

测试方法部分

public class MyMethods {
    @MyAnno(state = "开启")
    private void method1(){
        System.out.println("方法一执行了");
    }
    @MyAnno(state = "开启")
    private void method2(){
        System.out.println("方法二执行了");
    }
    @MyAnno()
    private void method3(){
        System.out.println("方法三执行了");
    }
    @MyAnno()
    private void method4(){
        System.out.println("方法四执行了");
    }
}

           

主方法测试部分

public class Test {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException {
        Class myMethodsClass = MyMethods.class;
        Method[] methods = myMethodsClass.getDeclaredMethods();
        Object o = myMethodsClass.newInstance();

        for (Method method : methods) {
        //被注释部分是判断当前方法是否被加了注解
        //boolean annotationPresent = method.isAnnotationPresent(MyAnno.class);
        //System.out.println(annotationPresent);
            MyAnno annotation = method.getAnnotation(MyAnno.class);
            if ("开启".equals(annotation.state().toString())){
                method.setAccessible(true);
                method.invoke(o);
            }
        }
    }
}
           

测试结果

被加了注解并且注解返回值是开启的方法执行了

方法二执行了
方法一执行了