昨天才开始学习kotlin,写了一天的kotlin感觉整个人都膨胀了,但kotlin有一个让我很头痛的地方就是它注解的书写,由于我对java注解的了解相当的少,甚至一直不明白它是什么,但是通过对hibernate validator 提供的注解类进行复制粘贴还是能够解决一些基本的“生理需求”的,但这回换了门语言,对于java注解类不熟悉的我在使用kotlin自定义校验注解类时就碰到了很多麻烦,实体类中有些字段类似于 @NotBlank 与 @Past 这样的注解
2018-04-12 10-13-00屏幕截图.png虽然hibernate validator 有提供很多甚至像@Pattern这样可以用正则表达式去自定义注解(图片只是个示例不是实际项目求别吐槽O(∩_∩)O~),但是很多情况下hibernate提供的这些注解,并不能满足我们的需求 只是非常简单的逻辑最复杂的只是让你写个正则表达式如图中的@Pattern注解类, 但是由很多时候我们校验是要基于数据的比如说这个用户 这个订单是不是存在 它在数据库是不是重复的等等 这些校验他不是简单的判断一下你传上来的值就可以了,它还需要其他的校验逻辑,这是我们必须要自个去写一些校验的逻辑,那么自己去写这些校验逻辑就需要自己写注解了,后面我会专门写一片文章去描述如何使用 kotlin 去实现 hibernate validator 的校验注解。那么今天我想通过这篇文章去了解一下java的注解类。也是通过这篇文章去做的这份学习笔记。
以下内容都来自于csdn frank909 作者的文笔。原文章 秒懂,Java 注解 (Annotation)你可以这样学 通过这篇文章我对java注解类有了非常多新的认识,也非常感谢作者。
下面是我通过篇文章的学习笔记:
注解只有成员变量,没有方法。 记住这句话很重要,它让我理解了注解的本质是什么,是用来干嘛的。
元注解
元注解是什么意思呢?
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
如果难于理解的话,你可以这样理解。元注解也是一张标签,但是它是一张特殊的标签,它的作用和目的就是给其他普通的标签进行解释说明的。
元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种。
注解的属性
注解的属性也叫做成员变量。注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id();
String msg();
}
上面代码定义了 TestAnnotation 这个注解中拥有 id 和 msg 两个属性。在使用的时候,我们应该给它们进行赋值。
赋值的方式是在注解的括号内以 value=”” 形式,多个属性之前用 ,隔开。
@TestAnnotation(id=3,msg="hello annotation")
public class Test {
}
需要注意的是,在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。
注解中属性可以有默认值,默认值需要用 default 关键值指定。比如:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
public int id() default -1;
public String msg() default "Hi";
}
TestAnnotation 中 id 属性默认值为 -1,msg 属性默认值为 Hi。
它可以这样应用。
@TestAnnotation()
public class Test {}
官方对注解的描述
注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。
注解有许多用处,主要如下:
- 提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
- 编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
- 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取
值得注意的是,注解不是代码本身的一部分。
如果难于理解,可以这样看。罗永浩还是罗永浩,不会因为某些人对于他“傻x”的评价而改变,标签只是某些人对于其他事物的评价,但是标签不会改变事物本身,标签只是特定人群的手段。所以,注解同样无法改变代码本身,注解只是某些工具的的工具。
回到官方文档的解释上,注解主要针对的是编译器和其它工具软件(SoftWare tool)。
网友评论