范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

为什么Java要用注解,那么这些注解有哪些作用呢

  注解的英文名叫"Annotation",是 Java 中给类、方法以及成员变量等元素增加元数据的方式。换言之注解就是用于描述这些元素的。
  元数据一词从单词 metadata 译来,意为"描述数据的数据"。
  注解和注释不同的是,注解会被 Java 编译器处理而非跳过。
  注解是在JDK5.0版本开始引入的,它可以在编译期使用预编译工具进行处理, 也可以在运行期使用 Java 反射机制进行处理。注释可以用于创建 Javadoc,跟踪代码中的依赖性,甚至执行基本编译时检查。本质上,Annotion是一种特殊的接口,程序可以通过反射来获取指定程序元素的 Annotion 对象,通过 Annotion 对象来获取注解里面的元数据。
  相比上来就给大家介绍注解的各种概念,它都有哪些作用外,我更希望把自己带入到一个 Java 小白的身份从零开始了解注解。我们通过"认识注解、使用注解"开始了解注解,随后带出 Java 原生自带的注解以及如何自定义注解,在编写自定义注解的时候顺便通过使用元注解把元注解的概念介绍一下,最后再来说注解都有哪些作用,以及使用注解带来的收益时需要付出什么代价。
  本文内容大纲如下:
  初识注解
  Java 注解的简写形式如下:@Entity 复制代码
  @ 符号告诉编译器这是一个注解, @ 字符后面的名称是注解的名称。在上面的示例中,注解名称是 Entity。
  注解还可以包含为其设置值的元素,类似注解的一个属性。下面是一个带元素的 PostMapping 注解示例。@PostMapping(path = "/") 复制代码
  上面的 PostMapping 注解包含一个名为 path 的元素,我们为其赋值为 "/"。设置元素值的语法是在注解名称后的括号内进行设置。
  一个注解可以包含多个元素,比如 PostMapping 注解就可以通过consumes元素,指定接收的请求体的格式为application/json@PostMapping(path = "/", consumes = MediaType.APPLICATION_JSON_VALUE) 复制代码
  当然,PostMapping 注解能设置哪些元素的值,也是根据 PostMapping 注解的定义来的。public @interface PostMapping {          // 省略其他元素的定义......     @AliasFor(         annotation = RequestMapping.class     )     String[] path() default {};      @AliasFor(         annotation = RequestMapping.class     )     String[] consumes() default {};          // ......  }  复制代码
  如果注解只包含一个元素,那么按照约定惯例,会把该元素命名成"value":@InsertNew(value = "yes") 复制代码
  当注解只包含一个名为 value 的元素时,使用注解时我们可以省略元素名称,只提供元素值。@InsertNew("yes") 复制代码使用注解
  Java 的注解可以应用在类、接口、方法、方法的参数、成员变量和方法内的局部变量之上,比如在类上应用注解,就是把注解放在类声明之上。@Entity @Table(name = "coffees") public class Coffee implements Serializable { 	// ...... }  复制代码
  下面这个例子在类、成员变量、成员方法、方法参数上都应用了注解。@RestController @RequestMapping("/order") @Slf4j public class CoffeeOrderController {     @Autowired     private CoffeeOrderService orderService;     @Autowired     private CoffeeService coffeeService;       /**      * 创建Coffee订单      *      * @param newOrder      * @return CoffeeOrder      */     @PostMapping(path = "/", consumes = MediaType.APPLICATION_JSON_VALUE)     public CoffeeOrder create(@RequestBody NewOrderRequest newOrder) { 		// ...     } } 复制代码
  上面是一个典型的 Spring MVC 的 Controller API 处理方法,如果你对 Spring 框架还不太熟悉,可以先不管这些注解什么意思,这里主要是演示一下注解可以用在哪里。在Java程序的这些成员上都可以加上注解,为成员添加元数据。Java 内置的注解
  Java 带有三个内置注解,可以直接被编译器处理,用于为 Java 编译器提供指令。这些注解是:@Override@Deprecated@SupressWarning@Override
  @Override 注解用于标注方法,它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们在一个没有覆盖父类方法的方法上应用 @Override 注解时,Java编译器会告警。public class MySuperClass {      public void doTheThing() {         System.out.println("Do the thing");     } }   public class MySubClass extends MySuperClass{      @Override     public void doTheThing() {         System.out.println("Do it differently");     } } 复制代码
  在覆盖了父类方法的子类方法上使用 @Override 注解并不是必需的。不过,使用了@Override 注解的方法,编译器在编译时会去父类找相同的方法签名,验证方法覆盖是否真实存在。
  使用@Override 注解的一个好处是--比如说有人在项目里修改了父类的被子类覆盖的方法,子类覆盖方法上不使用 @Override 注解的话编译器是不会提示出子类方法未覆盖父类方法的,可能会导致调用方无法正确调用到子类方法的问题,这时就显出 @Override 的重要性了。@Deprecated
  @Deprecated 注解用于将类、方法或字段标记为已弃用,这意味着不推荐再使用它。如果你的代码使用了不推荐使用的类、方法或字段,编译器在编译时会产生一条 Warning 级别的告警。@Deprecated public class MyComponent {  } 复制代码
  在类声明上方使用 @Deprecated 注解将该类标记为已弃用。 还可以在方法和字段声明上方使用@Deprecated 注解,将方法或字段标记为已弃用。 当使用 @Deprecated 注解时,最好也使用相应的 @deprecated 注解,该注解用于JavaDoc ,一般使用它来解释为什么不推荐使用以及应该改用什么。@Deprecated /**  * @deprecated Use MyNewComponent instead.  */ public class MyComponent {          @Deperecated     // @deprecated Use MyNewComponent"s printComponentName instead. 	public void printComponentName() {         System.out.println("MyComponent")     } } 复制代码@SupressWarning
  @SuppressWarnings 用于关闭对类、方法、成员编译时产生的特定警告。 @SuppressWarnings 不是一个标记注解。它有一个类型为 String[] 的数组成员,这个数组中存储的是要关闭的告警类型。对于 javac 编译器来讲,对 -Xlint 选项有效的警告名也同样对 @SuppressWarings 有效,同时编译器会忽略掉无法识别的警告名。@SuppressWarnings({"rawtypes", "unchecked"}) public class SuppressWarningsAnnotationDemo {     static class SuppressDemo {         private T value;          public T getValue() {             return this.value;         }          public void setValue(T var) {             this.value = var;         }     }      @SuppressWarnings({"deprecation"})     public static void main(String[] args) {         SuppressDemo d = new SuppressDemo();         d.setValue("London");         System.out.println("Place:" + d.getValue());     } } 复制代码自定义注解
  下面让我们自己定义一个注解。public @interface MyAnnotation {     String   value();     String   name();     int      age();     String[] newNames(); } 复制代码
  使用 @interface 关键字来声明一个注解,注解的声明有点类似于接口声明,其中的每一个方法实际上是声明了一个注解的元素。方法的名称就是元素的名称,返回值类型就是元素的值类型(返回值类型只能是基本类型、Class、String、enum)。这个例子定义了一个名为 MyAnnotation 的注解,它有四个元素。@MyAnnotation(     value="123",     name="Jacob",     age=37,     newNames={"Jenkov", "Peterson"} ) public class MyClass {  	// ... } 复制代码
  现在使用 @MyAnnotation 必须像上面这个例程中的这样,为其的所有元素指定值。但其实是可以在声明注解时给元素设置默认值的。注解元素的默认值
  在定义注解的时候可以为元素指定默认值。这样元素就变成了可选的,在使用的时候被省略则直接使用其默认值。下面是在注解定义里如何给元素指定默认值的例子:@interface MyAnnotation {     String   value() default "";     String   name();     int      age();     String[] newNames(); } 复制代码
  现在我们可以在使用 MyAnnotation 注解时选择省略 value 元素,这样注解会默认使用 value 元素的默认值。如下所示:@MyAnnotation(     name="Jakob",     age=37,     newNames={"Jenkov", "Peterson"} ) public class MyClass {   } 复制代码
  像上面这个例子,在注解的使用中我们并没有指定其 value 元素的值。元注解
  元注解是用于修饰注解的注解,在注解的定义中使用,例如:@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override {  }  复制代码
  这是 @Override 注解的定义,可以看到其中的 @Target,@Retention 两个注解就是『元注解』,元注解一般用于指定注解的生命周期以及作用目标等信息。 Java 中有以下几个元注解:@Retention:注解的生命周期或者叫保留策略@Target:注解的作用目标@Inherited:是否允许子类继承该注解@Documented:注解是否应当被包含在 JavaDoc 文档中@Retention
  我们可以为上面自定义的注解 MyAnnotation 指定它是否在运行时可用,以便能通过反射进行检查。通过在注解 MyAnnotation 的定义中使用 @Retention 元注解来做到这一点。import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;  @Retention(RetentionPolicy.RUNTIME)  @interface MyAnnotation {      String   value() default "";  } 复制代码
  添加到 MyAnnotation 定义上的元注解。@Retention(RetentionPolicy.RUNTIME) 复制代码
  会指示 Java 编译器和 JVM 当前注解在运行时可以通过反射获取到。RetentionPolicy 类表示注解的保留策略,包含三个两个可以使用的值:RetentionPolicy.RUNTIME 表示注解永久保存,在运行时可以通过反射获取。RetentionPolicy.CLASS 表示注解存储在 .class 文件中,在类加载阶段被丢弃,运行时不可用。RetentionPolicy.SOURCE 表示注解仅在源代码中可用,在 .class 文件和运行时中不可用。
  在定义注解时如果不指定注解的任何保留策略,RetentionPolicy.CLASS 就是默认的保留策略。如果创建的注解是与扫描代码的构建工具一起使用,则可以使用保留策略 RetentionPolicy.SOURCE,这样就会避免 .class 文件受到不必要的污染。@Target
  上面例子第一的 MyAnnotation 注解并没有标明该注解的作用目标,是能作用在类上,方法上,还是字段上。如果要限制注解的可作用目标的话,就需要在注解定义中使用 @Target 元注解来进行限制。
  下面我们给自己定义的 MyAnnotation 加上 @Target ,限制它只能注解方法上。import java.lang.annotation.ElementType; import java.lang.annotation.Target;  @Target({ElementType.METHOD}) public @interface MyAnnotation {      String   value(); } 复制代码
  ElementType 包含以下可用的枚举值:ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上ElementType.FIELD:允许作用在属性字段上ElementType.METHOD:允许作用在方法上ElementType.PARAMETER:允许作用在方法参数上ElementType.CONSTRUCTOR:允许作用在构造器上ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上ElementType.ANNOTATION_TYPE:允许作用在注解上ElementType.PACKAGE:允许作用在包上
  大部分枚举值的名称都是自解释的,可以通过字面单词意思看出来。有两个需要额外说明下,ElementType.ANNOTATION_TYPE 表示注解只能用于注解其他注解。在 @Target 和@Retention 这些元注解的定义里我们能看到使用的正式这个枚举值。@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target {     ElementType[] value(); } 复制代码
  ElementType.TYPE 表示注解能用于任何类型,可以是类、接口、枚举,包括注解。@Inherited
  @Inherited 表示自动继承注解类型。 如果注解声明中存在 @Inherited 元注解,则注解所修饰类的所有子类都将会继承此注解。java.lang.annotation.Inherited  @Inherited public @interface MyAnnotation {  }  ---  @MyAnnotation public class MySuperClass { ... }  ---      public class MySubClass extends MySuperClass { ... }  复制代码
  在这个例子中,MySubClass 会从父类 MySuperClass 自动继承 MyAnnotation 注解。@Documented
  @Documented 元注解被用于告知 JavaDoc 生成工具,当前注解需要在使用它的类的文档中显示。import java.lang.annotation.Documented;  @Documented public @interface MyAnnotation {  } 复制代码@MyAnnotation public class MySuperClass { ... } 复制代码
  当为 MySuperClass 生成 JavaDoc 的时候, @MyAnnotation 注解会被包含其中。 @Documented 这个元注解并不会经常用到,当我们看源码的时候遇到它后,能知道它是干什么用的就行了。Java 里注解的用途
  在 Java 里注解有许多用途,可以归纳为三类:编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查,编译器可以使用注解来检测错误或抑制警告。编译时和部署时的处理:程序可以处理注解信息以生成代码,XML 文件等。运行时处理:可以在运行时检查某些注解并处理。
  作为 Java 程序员,尤其是编程十几年年的老手,多多少少都曾经历过被各种配置文件(xml、properties)支配的恐惧。过多的配置文件会使得项目难以维护。使用注解可以减少配置文件或代码,是注解最大的用处,现在 Spring 家族的 SpringBoot 就是靠注解维护各种 Bean 组件的,让开发中者不再用XML指定各种Java Bean 的路径、名称等属性,减少了不少项目配置的步骤,从而让Java项目的开发提速了不少。
  原文:https://juejin.cn/post/7164655191201939486

一个家庭,最可怕的不是没钱,而是父母没眼界你怎么看?以我亲身经历为例子,我十分赞同这句话。因此也十分感激我的妈妈。我出生在一个农村里。说是农村,其实村民们也分层次。比如说,我家邻居,简称二姨,靠着卖烧烤,成为了整条街最有钱的人家。而一个人连续开车800公里以上,是一种什么体验?2014年,我被公司派驻哈尔滨分公司,从大连驾车去哈尔滨,途径沈海高速京哈高速,全程约930公里,车型一汽奔腾B90,行驶10。5小时,中间在辽宁井泉服务区午餐30分钟,吉林公主岭为什么国产车百花齐放,却在国际市场上连韩国现代都打不过?国产车研究的是中国,合资车研究的是世界,中国人讲究短平快弯道超车赚快钱,不在乎品牌的生命力。和办企业一个道理,不是想着怎么把产品做好而是想着尽快上市卖股票赚大钱,然后走人。要不是关福建人的年夜饭有什么特色菜吗?过年的时候,福建人的年夜饭都还是蛮丰盛的,因为南方人对于吃食颇为的讲究,不光是年夜饭,就连平常的吃饭也都是要必须有几菜一汤等,福建年夜饭太平燕,目鱼炖目鱼干,年糕,芋粿,春卷,黄花很多人都知道白酒是一级致癌物,但为什么还有这么多人喝酒呢?这观点有待商榷,适度饮酒有利健康。烟草和槟榔也是一级致癌物,为什么这么多人抽烟,这么多人嚼槟榔呢?另外,并不是白酒是一级致癌物,而是酒精,不用特意丑化白酒,所有酒都致癌,啤酒红酒威德阳旌南湿地公园现在好看吗?从本月初开始,德阳经开区市政建管中心就开始有计划的针对旌南湿地公园进行了美化升级,希望能在春节期间给市民朋友营造一股热闹的节日氛围。据有关部门介绍,旌南湿地公园已经种植了上万余株的假如黑洞将太阳吞噬,太阳系将会怎么样?假如黑洞将太阳吞噬,太阳系将会怎么样?不是种花家吓唬大家,还真有一个黑洞正在靠近太阳系,这可不是闹着玩的,黑洞大驾光临,它可不是来旅游的,唯一的目的就是吞噬太阳系,而且不留一点渣渣人类到底有没有登陆过月球?有何依据?美国曾经在上世纪60年代末70年代初成功将宇航员送上月球,这事应该是真实的。本文将列出一批档案证据来证明这一点。尽管至今还是有很多人对此持怀疑态度,说那都是在好莱坞片场里拍摄的影片因为工作没做好惹老板发脾气骂我明天不用来上班了,那我第二天还去不去啊?应该去上班。其实那只是老板的一句气话。C君是一个小公司的一个装货工,公司十几个人聚会的时候,C君一直在叨叨我最怕的事情就是自己一天有闲的时候,因为闲的时候就表示当天没什么货可出,没不裸辞的情况下你们是怎么找工作的,怎么去面试的?作为面试过少说有几千人的HR,我来回答你这个问题吧!不裸辞怎么找工作?这取决于你怎么和HR来沟通面试方式。首先你要知道,除了现场面试的方式之外,你还可以选择电话面试或者视频面试除了为什么一些路边的手机店一周卖不了几部手机,却依然活得很滋润?这个问题我来给专业的回答,我们老板开的店就是个老店,他的这个店干了大概有十多年了。以前的手机利润很暴力,特别是杂牌的手机,一台手机都三四百的利润,有的还多。最近这几年,是没有那么好
为雇主白做两年保姆,还搭上51万元存款!护理费抵顶购房款,六旬保姆掉入雇主陷阱文图半岛全媒体首席记者王永端如今65岁的郑祥翠,后悔6年前那次做家庭保姆的选择。2016年12月,当时的郑祥翠59岁。来自临沂市兰陵县尚岩镇农家的她,到青岛一家疗养院为青岛徐某生病我们不仅要活着,而且要活好听到过一句很励志的话这个世界有两件事对所有人是绝对公平的,一是每个人都只有一次生命,二是每个人每天都只有24小时。然而,在这样绝对公平的时时刻刻天天年年里,有的人只是勉强活着,有的有哪些唯美的句子值得分享?1。我们许久许久地缄默不语,只是一味地望着海面望着天空望着船口,晚风掠过海面而拂动草丛的时间里,暮色渐渐变成淡淡的夜色,几颗银星开始在船坞上方闪闪眨眼。2。人类进化这么多年也只是被人终其一生,最重要的是什么?辗转半生,终日奔忙,为了那碎银几两,慌慌张张。回首过往,你是否认真想过一个问题。终其一生,究竟在求什么?在为什么?在忙什么?最重要的又是什么?曾国藩说人生在世,功名富贵都是过眼云烟我们不一定有思想,但我们肯定会思考天阴沉的厉害,雨只下了几十个点,倒是乌云密布,作势压城。铅灰色的天空没有云雀,更没有鸿雁,有的,只是乌蒙蒙的低沉沉的背景。人真是很奇怪的生物,久旱无雨,便望穿了秋水。雨刚滴答了一时失去沟通,就是散场的开始千万千万不要选那种逃避型的对象,遇到事情不解决,就想着头也不回,先躲起来先走。什么事都会有他自己的一套逻辑,并且也不会告诉你,就在心里面默默给你判死刑,不沟通不解决就生闷气的那种。每天进步一点点为什么越省钱越穷有没有发现一个现象,现实中有很多人一辈子都抠抠搜搜的,做什么事情都很节俭,但是一辈子过去了也就这样,还是没有钱。其实,更多的时候不是因为省钱这件事导致的贫穷,省钱本身并没有错,节俭男生不穿内裤是一种放飞自我吗?是利大于弊还是弊大于利?总有一些奇怪的网友提出奇怪的问题男生不穿内裤是一种怎么样的体验,有什么好处!对于这个奇怪的问题,我自己是没有知识储备的,于是我去查了三天的资料,我终于解决了自己的知识盲区,如果你也共赴乌镇之约,共创美好未来11月9日,2022年世界互联网大会在乌镇正式开幕,世界目光再次聚焦这个千年古镇。这是中国连续第九年举办世界互联网大会。这九年,世界科技日新月异,数字经济蓬勃发展。2014年的世界不必羡慕任何人,过好自己的生活就好头号创作家文滕小七图均来自网络是从什么时候开始,道理和人生感悟都是自己悟出来的。很多时候,一些你纠结的想不明白的事,有可能在一瞬间,你就不纠结不犹豫了。还记得我之前写过一篇文章叫希我20岁到卡塔尔教乒乓球,住大别墅车接车送,却非常后悔想回国这是我们讲述的第1074位真人的故事我是李琛卡塔尔琛哥,1983年出生于河北石家庄,老家在桂林。父亲和我都是专业的乒乓球教练。我在卡塔尔教外国人打乒乓球,已经20年了。回想当初刚到