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

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

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

893bd461ffd615270afcc206119c85d8.png

45767017806e98e5b40fb3b3bc5d018a.png

一、什么是注解?

Annotaion

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

  • 注解(Annotaion)的格式:

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

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

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

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

    • 3059890ecf128f576af74127ba228a60.png

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

    • db78d90ef70057d7a9c466fddd20964f.png

    • @Controller
      public class RequestController {

      @DeleteMapping("/delete")
      @ResponseBody
      public 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 个注解:

注解名称作用
@SafeVarargsJava 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
@FunctionalInterfaceJava 8 开始支持,标识一个匿名函数或函数式接口。
@RepeatableJava 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 {

}

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

2a6c4e31429a06e66066205db285d29f.png

(二)@Target的用法详解

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

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

0165672982b35f4bbb302a26d1d9077f.png

可以看到传递的是一个E

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

可以看到下面这种情况。

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

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

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

ElementType[] value();
}

没加之前,先改造一下:

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

63fee3702cb99da3932ae94b5485f6f1.png

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

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

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

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

c3abe8d95796003d7cb37003e78e2645.png

那么这就是元注解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:

930dd594b8d6fe8477de0c8ab4a2b590.png

(三)@Retention的用法详解

1b3784536464e0038a8e5536e4a9d7d9.png

Retention中需要传递RetentionPolicy。

af07b965762be1c5c5654c48a4c418db.png

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
@Inherited
public @interface MyAnnotaion {

}

四、自定义参数详解

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

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

例如:

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

  • 2

  • 3

  • 4

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

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

//参数
String name();

}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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

136fe5f12c2626054aace0b260e31446.png

我们传递过来值:

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

}
  • 1

  • 2

  • 3

  • 4

bccfdcda2908c9f7f4fc362793c1f946.png

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

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

 String type() default "";
  • 1

536f892f6eea858fd21e06a93e76356b.png

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



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
@Inherited
public @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: 自定义注解测试
*/
@MyA
public 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);

}
}

}

}

}

运行:

fd368dc5b6818abe472f8e38f9cb5b3e.png

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

永久激活方案~

2020-07-29

910556107a7ed2abe94b4946c8ab8493.png

spring 状态机

2020-05-12

93ddfa09d99f7d9345747744666c29f3.png

mybatis用到的设计模式

2020-07-02

14855ba663fc8739d15596a62156c718.png

MySQL索引实现原理分析

2020-05-19

278c59431b5fcc6fe15c0131584bc326.png

Spring中的用到的设计模式

2020-04-23

8999d2e11a129a2a8a2738f0635b7a6e.png

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

2020-05-29

7f5afafff4025d17c004385743e8376a.png

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

2020-08-15

1c59bf4106802f68c8256ffcfb847c2c.png

美国也就那么回事吧

2020-08-15

de087ea6916dbfd89b4ce07b5f8f4e08.png

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

2020-08-14

d66d18094bef4f3fcb662f310c9c460e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yearning 2. 部署_对于企业来说,在选择协同办公系统的时候,选择私有化部署的数据安全一些,还是使用云服务器比较安全?...

当然是私有化部署!因为它除了安全,还有个性化~私有化部署,简单理解就是企业自己购买或租赁服务器,或者由服务商提供免费的云资源,然后将整个系统部署在企业自有的服务器上。采用这种方式,企业就不用担心自家…

numpy 平方_Numpy的终极备忘录

作者|Rashida Nasrin Sucky 编译|VK 来源|Towards Data Science Python是开源的。对于使用python的数据科学家来说,Numpy这个库是必不可少的。其他一些基本的库,如Pandas,Scipy是建立在Numpy的基础上。所以我决定做一份备忘录。这里我包括了到…

linux HZ 值_Linux的serial串口控制台

本人大多数情况都是在调试服务器大量的linux服务器,很多情况下也不没有必要专门准备KVM(keyboard, video, mouse),甚至有些机器根本就没有显示器接口。如何调试的?闲来无事,分享一下。有些人说“ 给我个Lin…

nginx文件系统大小_详解Nginx系列

1.Nginx特点Nginx是一个事件驱动架构,而非传统过程驱动架构。具有内存占用低,当并发连接大时,能够预测内存使用率。Nginx改变了传统的web服务器体系架构,提高了响应速度,起初Nginx开发的目标是实现10倍以上的性能&…

不可用于python编程开发的是_Python编程语言可做而不应做的一些事是什么_Python视频_Python视频教程_编程语言_课课家...

在 -5 ~ 256 之间的整型数值可以进行互换 当我在考虑这个能用在什么地方的时候,我有点迷茫了。撇开这点,你在此之前知道 Python 中的数字是可以改变其实际含义的吗?之所有会有这种情况,是因为 Python 解释器为 -5 ~ 256 之间的每一…

iphone7尺寸_iPhone 12 mini、12 Pro Max真机对比图赏:尺寸直观感受下

11月6日消息,等待多时,苹果iPhone 12 mini、iPhone 12 Pro Max将于今晚21点正式开启预定,11月13日发售。iPhone 12 mini是苹果尺寸最小、最轻薄的5G手机,而iPhone 12 Pro Max则是综合实力最强大,拍照最好的iPhone。赶在…

人脸识别错误代码437是什么意思_lol手游repeat ready check fails什么意思 解决攻略大全...

导读 lol手游repeat ready check fails什么意思?在日服内出现英文的错误代码,这两种语言的差异,会让国服玩家变得越来越混乱,想要解决问题,还是一如既往的得弄清楚代码内提示的内容是什么... lol手游repeat ready chec…

matlab求傅里叶级数展开式_连续时间的傅里叶级数

如果信号x(t)是周期信号,那么对于所有t,存在一个最小正数T,使得x(t)x(tT)其中T为这个周期信号的最小正周期。根据周期函数的周期性:x(t)x(tN*T)(N为整数)称为这个信号的基波频率周期信号x(t)也可以用周期复指数信号表示则因为x(t)是周期信号&…

delphi chart 曲线实时_发展学生曲线跑能力的体育游戏及运用研究

不想错过精彩的推送?戳左上角蓝字“体育教师大本营”关注并点击右上角●●●菜单栏选择“设置⭐️标”或“置顶公众号”每天早上7:00,体委伴您成长 一、曲线跑教材跑是人类在日常生活社会交往、生产劳动中的基本活动能力之一,从一定程度上反映…

拖拽的方式使用qbuttongroup_【无机纳米材料科研制图——Photoshop 0402】PS使用选框工具修改图片/图层...

此篇,我们来分享使用PS的选框修改图片。一、栅格化图形。1)同时选中两个图层。首先,回到上一篇中图片相互遮挡的状态。在上一篇中,我们通过调整图层的上下位置,避免了遮挡的情况,但有时候只通过调整图层的上…

pagerank数据集_从小白视角理解数据挖掘十大算法

关注上方“数据挖掘工程师”,选择星标,关键时间,第一时间送达!作者 | 雪山飞猪链接 | https://www.cnblogs.com/chenqionghe/p/12301905.html编辑 | 深度学习这件小事本文仅作技术交流,如有侵权,请联系删除…

filter过滤器_JavaWeb之 Filter(过滤器)

FIlter作用过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用…

css两张图片怎么合在一起_web前端入门到实战:纯CSS实现两个球相交的粘粘效果...

这是一个纯粹利用CSS所做出来的效果,这个效果说穿了就是一个图像处理的原理,做法跟Photoshop里头的几乎一模一样,只是一个用图层和色版来制作,一个则是用CSS(把div当成图层思考就好了)。从PhotoShop开始一开…

java 位运算取8位_Java 9 AOT 试用:仅支持 64 位 Linux和java.base 模块编译

Java 9 引入了 aot 编译方式,能够将 class 文件直接编译成可执行二进制文件。目前 Java 9 的 early access 版本已经提供了编译工具,让我们来看看它的功能吧。注意:按照 JEP 295 描述,目前版本的 AOT,仅支持 64 位 Lin…

友元关系可以继承_私生子也有继承权!非婚生子女的继承关系如何认定?

阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都会有分享,都是免费订阅,请您放心关注。注:本文转载自网络,不代表本平台立场,仅供…

mysql100多个字段如何优化_MySQL 调优/优化的 100 个建议

MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装环境,但是思路是相通的。我已经将它们分成了几类以帮助你理解。MySQL监控MySQL服务器硬件和OS(操作系统)调优&…

普罗米修斯监控java项目_java学到什么程度可以出去实习?

把基础的知识学完,然后再学个框架,比如常见的SSH,SSM之类的,自己能用这个框架做个简单的项目,就可以了简单的来说就是把下方的视频教程学完就可以找工作了(需要完整的资料可以找up)Java零基础初…

mysql中 唯一约束的关键字是_mysql的约束

在mysql设计表中,有个概念叫做约束什么是约束约束英文:constraint约束实际上就是表中数据的限制条件约束种类mysql的约束大概分为以下几种:非空约束(not null)唯一性约束(unique)主键约束(primary key) PK外键约束(foreign key) FK检查约束(目前MySQL不支持、Oracle…

叉乘点乘混合运算公式_小学36年级必须掌握的数学公式和概念口诀,替孩子收藏一下!...

小学数学需要记住的知识点还是比较多的,看到这些知识点,很多孩子都觉得枯燥,不愿意用心去记。如果我们把一种新的、有趣的记忆方法教给孩子,孩子也会变得有兴趣,因为兴趣是最好的老师。一、20以内进位加法看大数&#…

python图像数独_Python图像识别+KNN求解数独的实现

Python-opencvKNN求解数独最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s。整体思路大概就是识别出图中数字生成list,然后求解。输入输出demo数独采用的是微软自带的Microsoft sudoku软件随便截取的图像,…