注解的分类: 源码注解 编译时注解 JDK的@Override 运行时注解 Spring的@Autowired 自定义注解的语法要求 ① 使用@interface关键字定义注解 ② 成员以无参无异常方式执行 ③ 可以用defaut为成员指定一个默认值 ④ 成员类型是受限的包括原始类型,及String Class Annotation Enumberation ⑤ 如果注解只有一个成员,则成员名必须取名为value (),在使用时可以忽略成员名和赋值号(=) ⑥ 注解类可以没有成员,称为标识注解 package com.tsh.ano; import java.lang.annotation.Documented public @interface Description { String desc(); String author(); int age() default 18; } //使用注解 :注解的注解 使用自定义注解 解析注解
讲到 注解 我们就必须知道 在Java世界中,注解的类型。 元注解 自定义注解 注解修饰的范围 注解用来修饰,类、方法、变量、参数、包 什么是元注解? (JDK 只提供4个) 一般我们把元注解理解为描述注解的注解,元数据理解为描述数据的数据,元类理解为描述类的类… 分别是 @Target、@Retention、@Documented、@Inherited 什么是自定义注解? 除了4个元注解,其余的所有注解,都叫自定义注解 元注解详解 @Target:说明注解标记的对象,一般通过枚举ElementType 选值 可选的值有: CONSTRUCTOR: 用于描述构造器 FIELD 代码实现自定义注解 步骤: 使用 @Interface 定义一个注解 使用反射包 reflections 获得被标记的所有类,以及执行它们被标记的方法 <dependency>
文章目录 一、定义注解 二、使用注解 三、解析注解 四、通过注解对象获取注解属性的原理 在 【Java 注解】自定义注解 ( 注解属性定义与赋值 ) 博客中讲解了 注解属性 ; 在 【Java 注解】自定义注解 ( 元注解 ) 博客中讲解了注解中的元注解如何描述注解 ; 本篇博客开始讲解注解在程序中如何进行 解析 和 使用 ; 注解中定义了 若干 注解属性 , 那么就需要在某个阶段 , 将 注解属性 的值拿出来 调用 注解对象 中的抽象方法, 获取其返回值 // 注解的本质就是接口, 其中的注解属性本质是 抽象方法 // 注解对象可以直接调用注解超抽象方法, // 是因为在内存中生成了该 : name = " + name + " , age = " + age); } } 四、通过注解对象获取注解属性的原理 ---- 通过注解对象获取注解属性的原理 : 注解的本质就是接口, 其中的注解属性本质是 抽象方法 , 注解对象可以直接调用注解超抽象方法 , 是因为在内存中生成了该 注解 接口的子类对象, 实现了 name 和 age 方法 , 返回值就是本类注解中的 注解属性值 ;
文章目录 一、元注解 二、常用的元注解类型 三、@Target 元注解 四、@Retention 元注解 五、@Documented 元注解 六、@Documented 元注解 一、元注解 ---- 元注解 是 描述 注解 的 注解 ; 以 Override 注解为例 , 分析下该注解的 元注解 含义 : @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE : 描述 注解 是否被子类继承 , 如果添加了该注解 , 则子类会自动继承父类的注解 ; 三、@Target 元注解 ---- 查看 Target 注解的源码 , 该注解只有 1 个注解属性 , 且属性值是 * * @see java.lang.reflect.AnnotatedElement */ RUNTIME } 一般情况下 , 开发则自定义注解 , 都是在运行时进行一些代码分析 ---- @Inherited : 描述 注解 是否被子类继承 , 如果添加了该注解 , 则子类会自动继承父类的注解 ; 使用 @Inherited 元注解 标注 Annotation 注解 ; 使用
隐藏] @Target @Retention @Documented https://www.dqgs.fun/index.php/530/ @Target 这个枚举类型的常量提供了一个简单的分类:注解可能出现在 ,当Java文件编译成class文件的时候,注解被遗弃; RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期; RetentionPolicy.RUNTIME :注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在; @Documented @Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
创建@Aptx4869注解类import java.lang.annotation.*;/** * @author xuyuntong * @date 2020/9/29 10:13 */@Documented Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})public @interface Aptx4869 {}创建@Aptx4869注解类的切面拦截器 RequestContextHolder.getRequestAttributes()) .getRequest(); //当是post方法时,校验参数,否则走下方的设置参数,这意味着在调用这个post方法之前,需要调用另外一个有次注解的接口方法
组合注解用处很多,只是我们有时没注意而已,比如RestController,PostMapping,GetMapping等。他们的意义在于将多个注解组合在一起,写一个注解就够了。 定义组合注解 本节目的在于,组合Cacheable注解,将它的cacheNames写成默认的default(想想第一节最后的讨论)。 default") public @interface Interest { String key(); String unless(); } 其实以上代码就完成了注解组合 ,你在一个方法上夹Interest注解就相当于加了Cacheable注解。
自定义注解 一个完整的注解应该包含三个部分: (1)声明、 (2)使用、 (3)读取 声明自定义注解: 【元注解】 【修饰符】 @interface 注解名{ 【成员列表】 } 自定义注解可以通过四个元注解 6.1 定义自定义注解 import java.lang.annotation.*; @Inherited @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME ; @Column(columnName = "sname",columnType = "varchar(20)") private String name; } 6.3 读取和处理自定义注解 自定义注解必须配上注解的信息处理流程才有意义。 自己定义的注解,只能使用反射的代码读取。所以自定义注解的声明周期必须是RetentionPolicy.RUNTIME。
自定义注解 类名:Desc import java.lang.annotation.*; /** * @Author: www.itze.cn * @Date: 2020/09/13 14:58 * @Email: 814565718@qq.com */ /** * @Target:注解的作用范围,METHOD:作用在方法上,TYPE:作用在类上 * @Retention:注解的生命周期 is A Method") public void A(){} @Desc(value = "This is B Method") public void B(){} } 解析注解 public static void main(String[] args) { /** * 解析注解 * 获取类上的注解内容 (desc); } /** * 解析注解 * 获取类中方法上的注解内容 */ //获取类中所有方法
https://blog.csdn.net/ajianyingxiaoqinghan/article/details/81436118 Java 注解 —— 注解的理解、注解的使用与自定义注解 参考网址: 《秒懂,Java 注解 (Annotation)你可以这样学》 《Java注解基本原理》 《注解Annotation实现原理与自定义注解例子》 《框架开发之Java注解的妙用》 如果会在合适的地方恰好的使用注解或者自定义注解的话,老板肯定会双手送你 666 的。当然笔者现在只是初学而已,距离用技术吹牛逼的道路还远。 ——摘自《注解Annotation实现原理与自定义注解例子》 这里涉及的内容比较深入,笔者目前不能理解。先贴上来,以后慢慢来吧。 二. 自定义注解 此处参考《注解Annotation实现原理与自定义注解例子》的原理介绍和水果例程。
文章目录 一、自定义注解格式 二、注解本质分析 三、注解属性及类型 四、注解属性类型 五、注解属性赋值简化操作 一、自定义注解格式 ---- 分析 Java 中自带的 @Override 注解 , 源码如下 : ① 元注解 ; ② public @interface 注解名称 ; 二、注解本质分析 ---- 按照 public @interface 注解名称 格式 , 写出一个注解 , 编译该注解代码生成 { } 三、注解属性及类型 ---- 注解的本质是接口 , 接口中可以定义 常量 和 方法 ; 在注解中定义 接口方法 , 就是 注解的属性 ; 为注解添加属性 : 接口中的方法都是抽象方法 , 其中 , 否则会报错 ; 注解中定义了属性 , 在使用注解时 , 需要 给 注解属性 赋值 ; 定义 注解属性 时 , 可以 使用 default 关键字 指定属性默认值 , 下面代码中 , 制定 注解属性 并且 注解中只有 1 个属性 , 那么在使用 注解 为 注解属性 赋值时 , 可以省略注解名称 , 直接传入 注解属性值 ; 示例 : JDK 自带的 SuppressWarnings 注解 , @Target
java自定义注解 新建一个注解 新建一个java文件 比如叫做 MyAnnotation.java public @interface MyAnnotation { } 现在我们就有了一个自定义的注解 添加自定义注解的作用目标 需要在文件中添加@Target,用来规定@MyAnnotation的作用目标 @Target(ElementType.FIELD) public @interface MyAnnotation 但是这时候这个注解是没有任何意义的,我们还需要让我们的程序在运行的时候能够读取到我们的自定义注解,现在我们继续修改。 例如自定义注解 @MyAnnotation import java.lang.annotation.ElementType; import java.lang.annotation.Retention; 以上就是怎样自定义一个注解。 定义注解中的属性 注解中的属性定义类似interface中的方法。 格式是 返回值 属性名称()。
什么是注解: Annotation注解就Java提供了一种元程序中元素中的元素关联的任何信息和任何元数据(metadata)的途径和方法。 注解的分类: 根据注解参数的个数,我们可以将注解分为三类: 1.标记注解:一个没有成员定义的Annotation类型被称为标记注解。 比如后面的系统注解@Override; 2.单值注解 3.完整注解 元注解: 元注解的作用就是负责注解其他注解。 自定义注解: 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。 在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。
注解比较常用的场景:开发一个工具类、记录操作日志、自定义鉴权操作、需要某类型的对象,做一些固定的事....等等 三、自定义注解的定义 import java.lang.annotation.*; 官方注释上也说了,可以通过反射获取,前面也说到了,自定义注解通常都是基于反射来实现各种功能的,所以,这个将成为日后生涯中最常用的一个变量! ,对于以后使用自定义注解,掌握这三个元注解,必不可少! ( Stringvalue();) 至此为止,我们对刚刚写的那个做了一个很详细很详细的解释,从此以后,你就学会了如何定义自定义注解了,注意哈, 元注解是必须要加的,不加就没法用,后续会继续学习如何取使用自定义注解 五、总结 本片文章就自定义的注解的定义个使用,介绍的很详细!倒是代码阶段偏向于反射的使用更多一些!实际的生产环境下,反射+自定义注解的使用远比这复杂的多,但是万变不离其宗!
自定义注解【Annotation】 1.1. 元注解 1.1.1. @Retention 1.1.2. @Target 1.1.3. @Document 1.1.4. @Inherited 1.2. 参考文章 自定义注解【Annotation】 元注解 @Retention 表示需要在什么级别保存该注解信息 。 ):默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得 @Retention(RetentionPolicy.RUNTIME): 注解会在class字节码文件中存在,在运行时可以通过反射获取到 @Target(ElementType.PACKAGE) 包 @Document 注解包含在javadoc中 @Inherited 注解可以被继承 关于注解的反射方法 // 获取某个类型的注解 性能监控 可以定义一个注解实现性能监控,设置一个环绕通知即可,在程序执行开始和结束之后统计时间即可 定义一个注解,如下: import java.lang.annotation.*; /** * 性能监控的注解
什么是注解 注解用来给类声明附加额外信息,可以标注在类、字段、方法等上面,编译器、JVM以及开发人员等都可以通过反射拿到注解信息,进而做一些相关处理 SpringBoot 全部都是采用注解化 常用注解 元注解用来在声明新注解时指定新注解的一些特性 @Target 指定新注解标注的位置,比如类、字段、方法等,取值有ElementType.Method等 @Retention 指定新注解的信息保留到什么时候 ,取值有RetentionPolicy.RUNTIME等 @Inherited 指定新注解标注在父类上时可被子类继承 常用注解 @Target(ElementType.METHOD) // 指定新注解可以标注在方法上 MayiktName { public String name(); } 自定义注解 运行 :反射+aop 注解的Target TYPE:类、接口(包括注解类型)和枚举的声明 FIELD:字段声明 自定义限流注解 对我们接口实现 限流 比如 每s 只能访问1次 或者每s 访问两次。
这里我模拟一下spring的注解是如何执行的。 dataSource.getConnection(); threadLocal.set(conn); } return conn; } } 说到自定义事务注解 RetentionPolicy.RUNTIME) public @interface Transactional { } 接下来,新建一个业务类,也就是我们常常写service 我在类上打上刚刚新建的自定义事务注解 new User(); user.setName("伟哥"); user.setAge(1); bean.add(user); } } 1:没打上自定义事务注解 所以事务并没有生效 2:打上自定义事务注解 没有加上任何异常代码,正常执行,成功添加2条记录 在UserServiceImpl.add()方法加入异常代码,可以看到没有新增任何数据,说明事务生效了。
TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等。 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明。 本文主要记录个人的理解,全文基于Java SE8。 自定义注解 自定义注解分为两个部分:注解声明和注解处理逻辑。 每个注解可以有多个属性值,同名注解通过声明后可以在对象上使用多个。 Class> className() default Void.class; 表示自定义注解@LearnAnnotation有一个名为className的Class对象,此处需要注意,自定义注解的属性值只能是基本类型 – 注解是否可以被子类继承 元注解是实现自定义注解的重要工具,最重要的是@Retention与@Target。 例如对外提供接口调用时,需要对一些接口提供自定的参数校验等功能,可以考虑通过自定义注解的方式,提供一个 @Around advice,判断参数是否合理即可。
前言: 该篇以记录接口调用的传入参数日志为场景,来介绍下使用自定义注解作为切点,AOP切面方式去记录每个接口的传入参数以及可扩展的业务处理。 正文: 项目目录: 先是创建自定义注解, LogTrack: import java.lang.annotation.ElementType; import java.lang.annotation.Retention RetentionPolicy.RUNTIME) public @interface LogTrack { String value() default "logTracking"; } 上面的自定义注解 private static final Logger log = LoggerFactory.getLogger(LogTrackAspect.class); //这里需要注意了,这个是将自己自定义注解作为切点的根据 接下来是在Controller编写接口,并用上自定义注解,MyTestController: /** * @Author : JCccc * @CreateTime : 2020/3/27 * @
文章目录 一、定义注解 二、使用注解 三、解析注解 在 【Java 注解】自定义注解 ( 注解属性定义与赋值 ) 博客中讲解了 注解属性 ; 在 【Java 注解】自定义注解 ( 元注解 ) 博客中讲解了注解中的元注解如何描述注解 ; 在 【Java 注解】自定义注解 ( 注解解析 ) 博客中进行了注解的解析 ; 本篇博客实现一个简单的注解测试框架 , 主要进行以下几个步骤的操作 : 定义注解 : 定义用于添加到测试方法上的注解 ; 使用注解 : 在要测试的方法上添加注解 ; 解析注解 : 执行检测主方法 , 自动执行被添加注解的方法 ; 一、定义注解 ---- 定义注解 , 只用于标注函数 , 暂时不定义注解属性 ; 使用 元注解 标注 , @Target(ElementType.METHOD) 表示该注解作用于方法上 , @Retention(RetentionPolicy.RUNTIME) 表示保留到运行时 ; package ---- 首先 , 创建要测试的对象 , 之后的 获取注解 , 解析注解 , 反射并方法 , 都是基于该对象的 ; // 1.