被同事问到注解才发现自己已经忘记这方面的知识了,决定复习一下.
首先JDK提供了三个注解
@Override 重写
@Deprecated 过时
@SuppressWarnings 压制警告 例如:声明了变量未使用
元注解:用于注解注解的注解
@Target(ElementType.METHOD)
用于注解的位置 是个数组,可以有多个值, 例子中为用于注解方法
ElementType为枚举,有如下的值
TYPE 类,接口,注解,枚举
FIFELD 字段
METHOD 方法
PARAMETER 参数
CONSTRUCTOR 构造函数
LOCAL_VARIABLE 变量
ANNONATION_TYPE 注解
PACKAGE 包
@Retention(RetentionPolicy.SOURCE) 注解的有效期 例子中为源码
SOURCE 源码
CLASS 字节码 (默认)
RUNTIME 运行时
@Documented 会被javadoc 工具记录,文档记录
@Inherited 允许子类继承父类注解
实现@Test
注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
}
测试类
public class TestMyAnnotation {
@MyAnnotation
public void testInsert(){
System.out.println("testInsert执行了");
}
@MyAnnotation
public void testUpdate(){
System.out.println("testUpdate执行了");
}
@MyAnnotation
public void testDelete(){
System.out.println("testDelete执行了");
}
}
底层实现
public class Anno {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
//获取类的字节码文件
Class clazz = TestMyAnnotation.class;
//获取里面所有的方法
Method[] methods = clazz.getDeclaredMethods();
//遍历
for (Method method : methods) {
boolean flag = method.isAnnotationPresent(MyAnnotation.class);
//判断方法是否有注解
if (flag) {
method.invoke(clazz.newInstance(), null);
}
}
}
}