关于开发java自定义注解

一,jdk中的内置注解

  @Override  被标记的方法必须覆盖父类或者父接口的方法,否则编译不通过   

  @Deprecated  用于标记已经过时的方法

  @SuppressWarings   用于抑制编译器警告,被标记的地方编译时期不会出现警告

  @SafeVarargs  抑制堆污染警告,可以抑制使用泛型时出现的警告

二,元注解

  元注解是描述注解的注解。

  @Target  该注解定义注解的作用域,作用域如下

                     关于开发java自定义注解

  @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...........");
    }
}

 

 

  

上一篇:Django下从sqlite3切换到mysql需要做的操作


下一篇:跟光磊学Java开发-Java注解