点击蓝色字免费订阅,每天收到这样的好信息

前言:最近有不少粉丝关注本公众号。并且我已经成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧。大家想买什么书扫描下方的加他拉你加群。最后,非常感谢大家的关注。

一、什么是注解?

Annotaion

  • 注解(Annotaion)是从JDK5.0开始引入的一种新技术称之为注解机制。

  • 注解(Annotaion)的格式:

    • 注解是以"@注释名"在代码中使用的,可以添加一些参数值,例如:@GetMapping("/get")

  • 注解(Annotaion)可以使用的范围:

    • 当你如果要重写toString()方法的时候,不是按照规定的名字来写的话,就会报错:

    • 正常的话,是不会报错的:

    • 说明@Override注解带有检查的作用。

    • @Controllerpublic class RequestController {
      
      @DeleteMapping("/delete")@ResponseBodypublic String delete(String name,Integer id){        JSONObject json = new JSONObject();        json.put("requestType","deleteType");        json.put("name",name);        json.put("id",id);
      
      return json.toString();}
      
      }
    • 可以在package、class、method、field等上面使用。例如:

    • 我们可以通过反射机制编程对这些元数据的访问。

    • 注解有一些特定的功能,例如:

二、内置注解

Java内部定义了一套注解,共有7个:

注解名称 作用
@Override 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated 标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings 指示编译器去忽略注解中声明的警告。

作用在其他注解的注解(元注解):在java.lang.annotaion包中

注解名称 作用
@Retention 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented 标记这些注解是否包含在用户文档中。
@Target 标记这个注解应该是哪种 Java 成员。
@Inherited 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

从 Java 7 开始,额外添加了 3 个注解:

注解名称 作用
@SafeVarargs Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterface Java 8 开始支持,标识一个匿名函数或函数式接口。
@Repeatable Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

三、元注解的使用

(一)前期准备

如果你想自定义注解,那么元注解是必知必会必懂的。

元注解就是注解自定义注解的注解。可能有点饶,一会看例子就明白了,直白点就是给你自定义的注解上一定要加的注解

作用在其他注解的注解(元注解):在java.lang.annotaion包中

注解名称 作用
@Retention 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
@Documented 标记这些注解是否包含在用户文档中。
@Target 标记这个注解应该是哪种 Java 成员。
@Inherited 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

我们定义一个类,类的作用就是用来测试我们定义的注解:

/** * @Auther: truedei * @Date: 2020 /2020/9/6 18:11 * @Description: 自定义注解测试 */public class Test {

}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

然后创建一个类,把class标识符改成@interface:这就是自定义好的注解了。

/** * @Auther: truedei * @Date: 2020 /2020/9/6 19:00 * @Description: 自定义注解 */public @interface MyAnnotaion {

}

现在可以看到就可以使用了,只不过没有任何的功能:

(二)@Target的用法详解

我们来赋予一定的功能,来标识这个注解的作用:

加上元注解:@Target,就是用来指出对什么生效,作用的目标是什么,可以在什么地方使用。

可以看到传递的是一个E

可以点看@Target的源码看一下:

可以看到下面这种情况。

需要提前知道的是,value()是接收的参数,并不是一个方法。

那么Target就需要接收一个ElementType[]的数组。

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Target {

    ElementType[] value();}

没加之前,先改造一下:

可以看到这个注解什么都没加,既可以加在类上,也可以加在方法上,也可以加在变量上。

如果我们想做限制呢?只允许我们的这个注解对类生效

我们先来看一下Controller注解这个应该不陌生,就不解释了。

那么我们也可以加上这个:

可以看到效果了,只要类上的生效了,其余的都报错了。

那么这就是元注解Target的作用。

看一下ElementType.java中枚举的参数,这些都可以使用,了解下就好。

package java.lang.annotation;

public enum ElementType {    TYPE,               /* 类、接口(包括注释类型)或枚举声明  */

    FIELD,              /* 字段声明(包括枚举常量)  */

    METHOD,             /* 方法声明  */

    PARAMETER,          /* 参数声明  */

    CONSTRUCTOR,        /* 构造方法声明  */

    LOCAL_VARIABLE,     /* 局部变量声明  */

    ANNOTATION_TYPE,    /* 注释类型声明  */

    PACKAGE             /* 包声明  */

/**     * Type parameter declaration     *     * @since 1.8     */    TYPE_PARAMETER,

/**     * Use of a type     *     * @since 1.8     */    TYPE_USE}

如果你想让你的注解对什么生效,就指定好就OK:

(三)@Retention的用法详解

Retention中需要传递RetentionPolicy。

RetentionPolicy.java有三个枚举参数,如下:

package java.lang.annotation;public enum RetentionPolicy {    SOURCE,            /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    CLASS,             /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    RUNTIME            /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

一般都是调用**RUNTIME**,调用RUNTIME我们可以通过反射拿到相关的数据,来进行处理等。

由于这个不太好验证,就不一一验证了,了解就好

(四)@Documented的用法详解

如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。

定义 Annotation 时,@Documented 可有可无;

若没有定义,则 Annotation 不会出现在 javadoc 中。

(五)@Inherited的用法详解

子类可以继承父类的注解。

** * @Auther: truedei * @Date: 2020 /2020/9/6 19:00 * @Description: 自定义注解 */@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface MyAnnotaion {

}

四、自定义参数详解

注解的参数:参数的类型 + 参数名 ();

如果想有默认值还需要加上default 值。

例如:

//自定义参数1String name();//自定义参数2  带默认值的String type() default "";
  • 1

  • 2

  • 3

  • 4

我们给事先定义好的注解类加上一个参数,随便写名字即可:

@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface MyAnnotaion {

//参数    String name();

}  
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

可以看到我们在使用的时候,就会报错了,原因是必须要给这个定义好的参数传递一个值。

我们传递过来值:

@MyAnnotaion(name = "郑晖")public void test(){

}
  • 1

  • 2

  • 3

  • 4

这个时候就有同学要问了:我定义好参数之后,可以不传递参数吗,用到的时候再传递。

答案是可以的,如下:设置一个默认值就好了:

 String type() default "";
  • 1

当然了,也可以传递很多类型的参数例如:



import java.lang.annotation.*;

/** * @Auther: truedei * @Date: 2020 /2020/9/6 19:00 * @Description: 自定义注解 */@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface MyAnnotation {

//String类型    String name();

//int类型int age() default 0;

//boolean类型boolean bool() default false;

//char 类型char cha() default ' ';

//各种数组类型    String[] strs() default {};

//枚举类型    MyEnum myEnum() default MyEnum.A;

}

枚举类型类定义:



public enum MyEnum {    A,B,C,D;}

我们在使用的时候,就可以随心所欲的使用:



/** * @Auther: truedei * @Date: 2020 /2020/9/6 18:11 * @Description: 自定义注解测试 */public class Test {

    String data;

@MyAnnotaion(name = "郑晖",age = 85,cha = 'A',strs = {"aasd","xsw","你好"},myEnum = MyEnum.C)public void test(){

}

}

五、利用反射操作注解

MyA.java:



import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;

/** * 对于我们的作用:标识着加了这个注解的我们才允许扫描 */@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface MyA {

}

MyAnnotation.java:

import java.lang.annotation.*;

/** * @Auther: truedei * @Date: 2020 /2020/9/6 19:00 * @Description: 自定义注解 ---->给特定的方法用的 */@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotation {

//String类型    String name();

}

Test.java:

/** * @Auther: truedei * @Date: 2020 /2020/9/6 18:11 * @Description: 自定义注解测试 */@MyApublic class Test {

    String data;

@MyAnnotation(name = "郑晖")public void test(String name){        System.out.println("我的名字:"+name);}

}

测试类:

package cn.annotaion;

import java.lang.annotation.Annotation;import java.lang.annotation.Target;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Inherited;import java.lang.reflect.Method;/***测试类*/public class AnnotationTest {

public static void main(String[] args) throws Exception {

//拿到指定的类的Test        Class cl = Class.forName("cn.annotaion.Test");

//判断是否是我们特定自定义的注解  如果是就扫描if (cl.isAnnotationPresent(MyA.class)) {            Method[] methods = cl.getMethods();

for (Method method : methods) {// 判断 somebody() 方法是否包含MyAnnotation注解if(method.isAnnotationPresent(MyAnnotation.class)){// 获取该方法的MyAnnotation注解实例                    MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);

// 获取 myAnnotation的值,并打印出来                    String name = myAnnotation.name();                    System.out.println(name);

//执行这个方法                    method.invoke(new Test(),name);

}}

}

}

}

运行:

打油诗我不在乎我的作品文章是被现在的人读还是由子孙后代来读。既然上帝花了六千年来等一位观察者,我可以花上一个世纪来等待读者。

永久激活方案~

2020-07-29

spring 状态机

2020-05-12

mybatis用到的设计模式

2020-07-02

MySQL索引实现原理分析

2020-05-19

Spring中的用到的设计模式

2020-04-23

Spring 和 SpringBoot 之间到底有啥区别?

2020-05-29

如何快速搭建一个免费的 鉴黄 平台

2020-08-15

美国也就那么回事吧

2020-08-15

5T的Java视频教程全部免费获取

2020-08-14

@data注解不生效_你说啥什么?注解你还不会?相关推荐

  1. @data注解不生效_面试官:你经常在SpringBoot中使用的条件注解底层是如何实现的?你了解过吗?...

    SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation).比如@ConditionalOnBean.@ConditionalOnClass.@Conditio ...

  2. java 注解妙用_框架开发之Java注解的妙用

    PS:如果你还不会使用注解,你肯定不好意思对别人说你学过Spring,你学过Mybatis,因为它们用了大量的注解.可见注解在开发领域已经使用的非常广泛了. 配图.jpg 注解的好处: 1.能够读懂别 ...

  3. @Transactional +自定义注解不生效_技巧分享丨SolidWorks零件自定义属性如何连接到工程图?...

    ​ "3D数据协同挖掘" 小象来了~ 很多工程师给小象留言了--说自己的零件属性填写了,但是在SolidWorks工程图里面无法调用出零件的自定义属性那么我们如何操作才能正确调用出 ...

  4. @Data注解不生效的原因

    今天遇到@Data注解不生效的问题 @Data注解可以节省get,set等方法 解决方法 在idea中安装插件 安装完成之后重启idea 问题解决

  5. vue中data定义数字类型_[乐意黎原创] Vue中data定义的三种方式和区别

    在 Vue中,定义data时,经常有好几种写法,一不小心会混淆,这里彻底详述一下,以便记分清 . 一.在vue中,定义data可以有三种写法. 1. 第一种写法,data是一个对象. var app ...

  6. 记一次AOP+反射动态修改注解值成功后注解没有生效

    记一次AOP+反射动态修改注解值成功后注解没有生效 最近重新看了一下反射,突发奇想,在运行的时候在不同的方法上放入不同的注解值,然后获取到注解值进行修改.于是拿了hirbernate的@Validat ...

  7. idea @Data 不起作用找不到 相关的注解

    idea中@Data标签getset不起作用(这个有用,下面的没用) 2017年06月08日 11:22:40 seapeak007 阅读数:25816 spring cloud中使用@Data标签, ...

  8. 怎么获得ajax中data中的某个字段,关于$.ajax中data字段的整理--包括json转换和spring注解...

    1.前端$.ajax 的data为json提交的时候,[email protected] 注解 @RequestMapping(value = "getCpuData/{interval}/ ...

  9. @Transactional +自定义注解不生效_SpringBoot之路(三)SpringDataJpa中常用注解的使用...

    1 @Query注解详解及其用法 说明:本文的写作构建在笔者的SpringBoot之路(二)使用用Spring-Data-JPA访问数据库进行基本的CRUD操作这篇文章的基础之上. @Query注解在 ...

最新文章

  1. 做时间序列预测没必要深度学习!GBDT性能超DNN
  2. 图解LSTM神经网络架构及其11种变体(附论文)
  3. mysql 学习笔记15 子查询
  4. 理解什么是前后端分离
  5. Linux命令终端提示符显示-bash-4.2#解决方法【转载】
  6. 7-218 修理牧场 (25 分)
  7. 第一个帖子吧,我也博客了!
  8. AcWing提高算法课Level-3 第六章 基础算法
  9. netty 使用阻塞发送_大数据、分布式都用到了的Netty,这几大核心知识你一定要看看!...
  10. Stackoverflow每日问题 系列前言
  11. 达思sql数据库修复软件:用友金蝶管家婆思迅中了勒索病毒怎么办?
  12. 安全工具系列 -- 信息收集(二)
  13. Dorado7的初次使用
  14. SQL Server 搭建Northwind详细教程
  15. 标准盒模型和怪异盒模型小结
  16. Xshell 6链接Liunx链接不上:
  17. 自动泊车之AVM环视系统算法框架
  18. 探秘前端 CRDT 实时协作库 Yjs 工程实现
  19. Android消息传递机制总结
  20. 使用 FFmpeg 推流,使用 VLC 软件进行拉流

热门文章

  1. 多媒体融合通信平台促进公网和专网的互联互通
  2. 请问,现在android流行什么开源框架?
  3. php源码自动识别文本中的链接,自动加载识别文件Auto.php
  4. [转载] python 元组tuple - python基础入门(14)
  5. php 文字超出画布,input实现文字超出省略号(代码示例)
  6. abap 添加alv上的工具栏的按钮_神器必会!“世界上最好的编辑器Source Insight”...
  7. mysql属于数据库三级模式_数据库系统的三级模式指的是什么
  8. android 集成x5内核时 本地没有,腾讯浏览服务-接入文档
  9. matplotlib画图_漂亮,超详细的matplotlib画图基础
  10. setdefault_Java语言环境setDefault()方法及示例