如何定义一个注解
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()
@Target()用于声明自定义注解可以加在什么地方,常用的参数有
ElementType.METHOD//可以放在方法上
ElementType.FIELD//可以加在成员变量上面
ElementType.TYPE//可以加载类上
下面这个用于设置 注解的生命周期,即使什么时候这个注解起作用
@Retention()
解析注解
注解通常和反射一起使用是框架技术的灵魂
笔者认为解析注解有这么几个功能比较常用
- 获得加注解的部分–谁被加了注解
- 获得注解中的参数
案例
把上面的代码进行改进。
- 自定义一个注解,只能加在方法上面
- 自定义注解的生命周期注意设置为运行时
- 为被添加注解的类添加四个方法
- 创建主方法
- 获得被加注解的方法
- 根据注解的值来运行方法
注解部分
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);
}
}
}
}
测试结果
被加了注解并且注解返回值是开启的方法执行了
方法二执行了
方法一执行了