在Spring以及其他框架中注解使用很频繁,在框架中一个简单的注解就能完成很多事情。

1、java注解分类:

  • 元注解:可以注解其它注解的注解,用于自定义注解
  • 自定义注解:可分为标记注解(没有元素的注解)和非标记注解
  • 第三方注解:比如spring的注解@Value等

2、注解使用

  • 元注解:

@Target 限定注解可以使用的地方

@Retention 限定注解可以使用的级别

@Inherited 如果自定义注解使用了该元注解注解,并自定义的注解使用于父类的类级别,那么子类的类级别也会继承该自定义注解

@Document 生成文档使用

  • java提供的3个常用注解:

@Override 表示当前方法覆盖了父类的方法,如果被覆盖但没有加该注解,编译器会提示错误

@Deprecated 表示方法已经过时,在其它地方使用该方法,编译器会在方法名中间显示横线提示

@SuppressWarnings  关闭不当的编译器警告

  • 自定义注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface UseCase {
    int id();
    String desc() default "no desc";
}
    • 使用了三个元注解,UseCase只能使用在运行级别使用在方法,如果@Target(ElementType.METHOD,ElementType.ClASS)注解一个类级别,那么@Inherited会起作用,子类会继承父类类级别的注解。
    • 继承中,如果父类的方法中有注解修饰,但是子类重写了父类的方法,则注解不会生效,除非调用的是父类的方法。
    • 注解中元素的约束:元素修饰符固定为public abstract,也可以缺省,但不能使用其他的修饰符;元素的使用的时候必须有值,要么使用默认值,要么赋值一个,当然也可以指定一个而不使用默认值。
  • 三方注解:略

3、注解处理器

注解如果单独存在,那么就没有意义了,需要搭配注解处理器,对注解进行处理。比如打印日志,自定义@PrintLog注解并编写注解处理器LogHandler,在spring中使用AOP面向切面编程配置注解处理器,即可打印日志。

此处不涉及框架:应用自定义注解@UseCase

package com.zhujie;

public class PasswordUtils {

    @UseCase(id = 1)
    public boolean validPasswd(String passwd){
        return true;
    }

    @UseCase(id = 2,desc = "重置密码")
    public String resetPasswd(String passwd){
        return "123456";
    }
}

注解处理器+测试方法

package com.zhujie;

import java.lang.reflect.Method;

public class AnnotationHandler {

    /**
     * 注解处理器方法
     * @param cl
     * @param methodName
     * @throws NoSuchMethodException
     */
    public static void handler(Class cl, String methodName) throws NoSuchMethodException {
        Method method=cl.getMethod(methodName, String.class);
        UseCase annotation=method.getAnnotation(UseCase.class);
        int id=annotation.id();
        String desc=annotation.desc();
        System.out.println("id为:"+id+"ndesc为:"+desc);
    }

    /**
     * 测试方法
     * @param args
     * @throws NoSuchMethodException
     */
    public static void main(String[] args) throws NoSuchMethodException {

        PasswordUtils passwordUtils=new PasswordUtils();
        passwordUtils.validPasswd("000000");
        handler(PasswordUtils.class, "validPasswd");
    }
}

输出结果

id为:1
desc为:no desc

在注解处理器方法中使用了java的反射机制,这是不可避免的。

4、反射:略

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!