java自定义注解
2018-06-19 本文已影响0人
wxz1997
一、元注解
java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):
@Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target –注解用于什么地方
@Inherited – 是否允许子类继承该注解
@Retention– 定义该注解的生命周期
- RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
- RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
- RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
二、自定义注解
自定义注解,并没有对所加注解的方法起作用,为了让这些注解起作用,需要通过反射的方式获取该注解携带的信息。
package cn.wxz1997.concurrency.annotation;
import java.lang.annotation.*;
/**
* @Description: 自定义注解
* @Author: wxz1997
* @Date 18-6-19下午1:27
*/
@Inherited //是否允许子类继承该注解
@Documented //注解是否将包含在JavaDoc中
@Target(ElementType.METHOD) //设置该注解修饰的地方,如设置为METHOD,则只能应用于方法
@Retention(RetentionPolicy.RUNTIME) //表示该注解可以保留到运行时
public @interface MyAnnotation {
/**
* 注解的成员变量要以无参方法的形式定义,可以使用default给其设置默认值
* @return
*/
String description() default "自定义注解";
}
package cn.wxz1997.concurrency.annotation;
/**
* @Description: 测试对象
* @Author: wxz1997
* @Date 18-6-19下午1:55
*/
public class Test {
@MyAnnotation(description = "执行test方法")
public void test(){
System.out.println("test方法执行");
}
}
package cn.wxz1997.concurrency.annotation;
import java.lang.reflect.Method;
/**
* @Description: 自定义注解处理工具类
* @Author: wxz1997
* @Date 18-6-19下午1:56
*/
public class ActionUtil{
public static void test(String className) {
try {
Class cls = Class.forName(className);
Object obj = cls.newInstance();
Method[] methods = cls.getMethods();
for (Method method: methods){
//获取方法上的注解
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
//存在此注解,则调用该方法
if (null != myAnnotation){
String description = myAnnotation.description();
System.out.println("该方法的描述为:" + description);
method.invoke(obj, new Object[] {});
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ActionUtil.test("cn.wxz1997.concurrency.annotation.Test");
}
}