注解

2019-05-22 06:35:30来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

 

Annotation,注解,是代码里的特殊标记,可以在编译、类加载、运行时被读取,并执行相应的处理。

注解用于为程序元素(类、方法、成员变量等)设置元数据,相当于一些补充信息,并不影响程序的执行。

注解需要使用特定的工具来处理、执行,访问、处理注解的工具统称为APT。

 

 

常见注解:

1、@Override

限定重写父类的方法。@Override相当于告诉编译器检查这个方法,要保证父类包含一个被该方法重写的方法,否则会编译出错。

主要是为了避免一些低级错误,比如要重写父类的info()方法,我们一不小心写成了inf0(),并不会报错,加上@Override后则会提示错误。

@Override只能修饰方法

 

 

2、@Deprecated

表示某个程序元素已经过时,不再推荐使用。

功能和文档注释的@deprecated相同,但@deprecated只能放在文档注释中,@Deprecated直接修饰程序单元,比如类、接口、方法等。

1   @Deprecated(since = "9",forRemoval = true)

有两个可选参数:since表示从哪个JDK版本起就不再推荐使用了,forRemoval表示未来是否会删除此xx,true表示未来会被删除。

 

 

3、@SuppressWarnings

抑制编译器警告。指定编译器不发出/忽略某方面的警告。

1   @SuppressWarnings(value = "unchecked")   

有一个必须参数:value,指定编译器不发出/忽略哪些警告。“unchecked”是不发出、忽略所有警告。

 

 

4、@SafeVarargs

抑制堆污染警告。作用和上一个相同,只是@SafeVarargs专用于堆污染警告。

 堆污染(heap pollution):传入的参数不是指定的类型。比如某个方法需要传入List<Integer>类型的参数,我们传入一个List<String>类型的参数,就会造成堆污染,编译会报错。

 

5、@FunctionalInterface

指定这个借口必须是函数式接口。@FunctionalInterface相当于告诉编译器检查这个接口定义,此接口中只能包含一个抽象方法,否则编译出错。

@FunctionalInterface只能修饰接口。

 

说明:以上注解只作用于它修饰的程序元素。

 

 

 

 

 

元注解(Meta注解):用于修饰其它注解的定义。元注解只能修饰其它注解的定义。

常见的元注解:

1、@Retention

指定被修饰的注解可以保留到什么时候。

需要指定一个参数:预定义的常量值,表示被修饰注解保留到何时(相当于指定生命周期何时结束)。

比如指定被修饰的注解保留到运行时,即该注解只在运行时、及之前起作用。

 

 

2、@Target

指定被修饰的注解 可以/只能 修饰哪些程序元素。

 

 

3、@Documented

指定被修饰的注解会被javadoc工具提取。

 

 

4、@Inherited

指定被修饰的注解具有继承性。

即使用被修饰的注解修饰某个类、接口,其子类也会自动被该注解修饰。

 

 

 

 

 

Java8以前,如果同一个程序元素要使用多个相同类型的注解,必须使用注解容器。比如Strut有时需要在Action类上使用多个@Result注解:

1  @Results({ @Result(name="failure",location="failed.jsp") , @Result(name="success",location="succ.jsp") })

@Results({     })是注解容器(注解名+s),里面放置多个同名的注解。

 

Java8新增了重复注解,上面的代码可简写成:

1     @Result(name="failure",location="failed.jsp") 
2     @Result(name="success",location="succ.jsp")

 

 

 

Java8新增的类型注解:

 1 @NotNull     //不能为null
 2 public class Test {
 3    @NotNull  //表示此成员变量的值不能为null
 4    private String name;
 5    public int getValue() throws @NotNull Exception{   //不能为null
 6        int result=(@NotNull int)1.23;   //表示后面一定要有值,不能为null
 7        return result;
 8    }
 9 
10    public void setName(@NotNull String name){  //表示此参数的值不能为null
11         this.name=name;
12    }
13   }
14 }

类型注解可以放在任何数据类型之前,表示被修饰的程序类型不能为null,为null会抛出异常。

 

 

框架中常用的注解:

 1 @Null  被注释的元素必须为null
 2 @NotNull  被注释的元素不能为null
 3 @AssertTrue  被注释的元素必须为true
 4 @AssertFalse  被注释的元素必须为false
 5 @Min(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
 6 @Max(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
 7 @DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值
 8 @DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值
 9 @Size(max,min)  被注释的元素的大小必须在指定的范围内。
10 @Digits(integer,fraction)  被注释的元素必须是一个数字,其值必须在可接受的范围内
11 @Past  被注释的元素必须是一个过去的日期
12 @Future  被注释的元素必须是一个将来的日期
13 @Pattern(value) 被注释的元素必须符合指定的正则表达式。
14 @Email 被注释的元素必须是电子邮件地址
15 @Length 被注释的字符串的大小必须在指定的范围内
16 @NotEmpty  被注释的字符串必须非空
17 @Range  被注释的元素必须在合适的范围内

以上注解基本都是在框架中定义中,要在框架中使用(不是JDK自带的),可以让编译器执行更严格的检查。

@NotNull是例外,在JDK中也有。

 

示例:

 1 public class User implements Serializable {
 2     /**
 3      * 主键
 4      */
 5     @NotNull(message = "primary is not null",groups = {GroupInterface1.class})
 6     private Long id;
 7     
 8     @Pattern(regexp = "[0123456789]",groups = {GroupInterface1.class,GroupInterface2.class},message = "hava a error Date")
 9     private Long maxDiscountAmount;
10     
11 
12     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
13     private Date createTime;
14 
15     @Future(message = "expireTime is not less than now",groups = {GroupInterface1.class,GroupInterface2.class})
16     @NotNull(message = "expireTime is not null",groups = {GroupInterface1.class,GroupInterface2.class})
17     private Date expireTime;
18 
19 }

 

示例:

 1 public class Test{
 2 
 3     // 非空判断
 4     @NotNull(message = "id不能为空")
 5     private Long id;
 6 
 7     @Future(message = "需要一个将来日期") // 只能是将来的日期
 8     // @Past //只能去过去的日期
 9     @DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化转换
10     @NotNull // 不能为空
11     private Date date;
12 
13     @NotNull // 不能为空
14     @DecimalMin(value = "0.1") // 最小值0.1元
15     @DecimalMax(value = "10000.00") // 最大值10000元
16     private Double doubleValue = null;
17 
18     @Min(value = 1, message = "最小值为1") // 最小值为1
19     @Max(value = 88, message = "最大值为88") // 最大值88
20     @NotNull // 不能为空
21     private Integer integer;
22 
23     @Range(min = 1, max = 888, message = "范围为1至888") // 限定范围
24     private Long range;
25 
26     // 邮箱验证
27     @Email(message = "邮箱格式错误")
28     private String email;
29 
30     @Size(min = 20, max = 30, message = "字符串长度要求20到30之间。")
31     private String size;
32     //.......
33     }

 

 

可以同时使用多个注解修饰同一个程序元素。

 

当然,我们可以使用自定义的注解。

 


原文链接:https://www.cnblogs.com/chy18883701161/p/10901773.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Spring Cloud(9):Config配置中心

下一篇:Java面试题,深入理解final关键字