一,jdk中的内置注解
@Override 被标记的方法必须覆盖父类或者父接口的方法,否则编译不通过
@Deprecated 用于标记已经过时的方法
@SuppressWarings 用于抑制编译器警告,被标记的地方编译时期不会出现警告
@SafeVarargs 抑制堆污染警告,可以抑制使用泛型时出现的警告
二,元注解
元注解是描述注解的注解。
@Target 该注解定义注解的作用域,作用域如下
@Retention 该注解定义注解存活的作用域,一共有三个存活的作用域,Source,Class,Runtime。其中Runtime存活时间最久,我们自定义注解存活作用域必须是Runtime
@Documented 被该标记标注的注解在制作javadoc的时候也会保留进去
@Inherited 被该注解标记的注解具有继承性,如果被标记的类有子类,通过反射可以从子类上获取同样的注解
三,如何开发自定义注解
1,编写自己自义的注解类
2,编写注解解析类
3,编写注解所处理类
以模拟单元测试注解为例,代码如下
package com.wzw.activemqstudy.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 自定义注解类 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyTest { }
package com.wzw.activemqstudy.annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** *自定义注解解析类 */ public class MyTestParse { public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException { //拿到测试类的字节码对象 Class clz = TestDemo.class; //通过反射得到所有方法对象 Method[] methods = clz.getMethods(); if(null != methods){ for (Method method : methods) { //判断方法上是否有@MyTest注解标记 if(method.isAnnotationPresent(MyTest.class)){ method.invoke(clz.newInstance(),null); } } } } }
package com.wzw.activemqstudy.annotation; /** *自定义注解要处理的类 */ public class TestDemo { @MyTest public void test1(){ System.out.println("运行test1............."); } @MyTest public void test2(){ System.out.println("运行test2..........."); } @MyTest public void test3(){ System.out.println("运行test3..........."); } }