了解一下Java注解

注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
注解可以用来生成描述符文件,甚至是新的类定义,也有助于减轻编写“样板”代码的负担。
注解实际上也是一个类,除了@符号的使用外,基本与Java固有的语法一致。

标准注解

目前内置了三种标准注解:

  • @Override,表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。
  • @Deprecated,deprecated: 弃用的意思。如果使用了注解了该注解的元素,编译器会发出警告信息。
  • SuppressWarnings,关闭不当的编译器警告信息。

四种元注解

元注解负责注解其他的注解。

  • @Target:表示该注解可以用于什么地方。ElementType参数包括:CONSTRUCTOR(构造器的声明)/FIELD(域声明)/LOCAL_VARIABLE(方法变量声明)/METHOD(方法声明)/PACKAGE(包声明)/PARAMETER(参数声明)/TYPE(类、接口(包括注解类型)或enum声明)
  • @Retention:表示需要在什么级别保存该注解信息。RetentionPolicy参数包括:SOURCE(注解将被编译器丢弃)/CLASS(注解在class文件中可用,但会被VM丢弃)/RUNTIME(VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息,实际上用的最多的就是这个)
  • @Documented:将此注解包含在Javadoc中,如@author。
  • @Inherited:允许子类继承父类中的注解。

注解的作用

注解是在实际的源代码级别保存所有的信息,而不是某种注释性的文字。通过使用扩展的annotation API,或外部的字节码工具类库,将可以对源代码以及字节码进行检查和操作。实际注解可以理解为一种给机器读的注释。使用注解的过程中,很重要的一个部分就是创建与使用注解处理器,用来读取注解。
在注解中,一般都会包含元素以表示某些值。当分析处理注解时,程序或工具可以利用这些值。
没有元素的注解称为标记注解,就是用来为某些代码打上标记。

注解元素

注解元素可用类型:

  • 所有基本类型
  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组

如果使用了其他类型,那编译器就会报错。

举个栗子

注解常常与反射机制结合,通过反射在运行期获取注解中的参数。

\\UseCase.java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
    public int id();
    public String description() default "no description";
}
\\PasswordUtils.java
public class PasswordUtils {
    @UseCase(id = 47, description = "Passwords must contain at lease on numeric")
    public boolean validatePassword(String password) {
        return (password.matches("\\w*\\d\\w*"));
    }

    @UseCase(id=48)
    public String encrytPassword(String password) {
        return new StringBuilder(password).reverse().toString();
    }

    @UseCase(id=49,description = "New passwords can't equal previously used ones")
    public boolean checkForNewPassword(List<String> prevPasswords, String password) {
        return !prevPasswords.contains(password);
    }
}
\\UseCaseTracker.java
public class UseCaseTracker {
    public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
        /**
         * cl类通过反射调用getDeclaredMethods()获取类中定义的方法,Method类,
         * 然后通过method就可以调用getAnnotation获取注解对象
         * 通过注解对象就能提取对象里面的元素值了。
         */
        for (Method m : cl.getDeclaredMethods()) {
            UseCase uc = m.getAnnotation(UseCase.class);
            if (uc != null) {
                System.out.println("Found use Case:"+uc.id()+" "+uc.description());
                useCases.remove(new Integer(uc.id()));
            }
        }
        for (int i:useCases) {
            System.out.println("Warning: Missing use case-"+i);
        }
    }

    public static void main(String[] args){
        List<Integer> useCases = new ArrayList<>();
        Collections.addAll(useCases, 47, 48, 49, 50);
        trackUseCases(useCases, PasswordUtils.class);
    }
}
\\Output
Found use Case:48 no description
Found use Case:47 Passwords must contain at lease on numeric
Found use Case:49 New passwords can't equal previously used ones
Warning: Missing use case-50

默认值限制

  • 元素不能有不确定的值,也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值。
  • 对于非基本类型的元素,无论是在源代码中声明时,或是在注解接口中定义默认值时,都不能以null作为其置。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,379评论 1 92
  • 如果我是一本书,我的名字叫作《家》。我本来以为我会写一本叫做《飘》的故事,写写我的血泪成长史,我的巴特勒船长...
    归来心蓝阅读 341评论 0 2
  • 昨天节目预告说 今天下午播放动画片樱桃小丸子 我知道你喜欢看 所以我提前打开了我妈唠叨说费电的风扇 还用我的压岁钱...
    玫瑰西海岸阅读 279评论 2 2
  • 01 古时候,有句话叫做:西出阳关无故人。确实,在古代,交通不这么发达,人们到外地,或者说是远方,靠的都是坐...
    浪子江南阅读 567评论 0 0