-
2022-02-23 17:26:39
使用Annotation 时要在其前面增加@ 符号, 并把该Annotation 当成一个修饰符使用。用于修饰它支持的程序元素
示例一:生成文档相关的注解
@author标明开发该类模块的作者,多个作者之间使用,分割
@version标明该类模块的版本
@see参考转向,也就是相关主题
@since从哪个版本开始增加的
@param对方法中某参数的说明,如果没有参数就不能写
@return对方法返回值的说明,如果方法的返回值类型是void就不能写
@exception对方法可能抛出的异常进行说明,如果方法没有用throws显式抛出的异常就不能写其中
@param@return和@exception这三个标记都是只用于方法的。
@param的格式要求:@param形参名形参类型形参说明
@return的格式要求:@return返回值类型返回值说明
@exception的格式要求:@exception异常类型异常说明
@param和@exception可以并列多个
示例二:在编译时进行格式检查(JDK内置的三个基本注解)
@Override: 限定重写父类方法, 该注解只能用于方法
@Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
@SuppressWarnings: 抑制编译器警告
示例三:跟踪代码依赖性,实现替代配置文件功能
Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署。
spring框架中关于“事务”的管理更多相关内容 -
敏感:java基于Java注释的Java敏感日志工具。 (基于注解的java脱敏框架,更优雅的日志打印)
2021-02-03 20:46:22项目介绍 普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。 本项目提供基于注解的方式,并内置了常见的脱敏... java深拷贝,且原始对象不用实现任何接口。 支持用户自定义注解。 支持基于FastJSO -
Java 注解
2020-12-22 06:54:31提到注解,我们会不由的想到注释,其实注解和注释不是一个东西,注释的作用就是解释代码,方便理解和阅读,说白了就是给程序员看的。而注解则不是,注解的作用比较大,可以进行编译检查、生成doc文档或者进行代码... -
Java注解
2021-03-14 21:50:13注解,不仅仅是给人看的,还给程序看,还能被程序读取一、什么是注解1、Annotation是从JDK5.0开始引入的新技术2、Annotation的作用(1)、不是程序本身,可以对程序做出解释(这一点和注释(Comment)没什么区别)(2)、...注解,不仅仅是给人看的,还给程序看,还能被程序读取
一、什么是注解
1、Annotation是从JDK5.0开始引入的新技术
2、Annotation的作用
(1)、不是程序本身,可以对程序做出解释(这一点和注释(Comment)没什么区别)
(2)、可以被其他程序(比如编译器)读取
3、Annotation的格式:
(1)、注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="all").
4、Annotation在哪里使用
(1)、可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。
二、常用的内置注解
@Override:这个大家应该不陌生,重写。定义在java.lang.Override中,此注解只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法的声明
@Deprecated:定义在java.lang.Deprecated中,此注解可以用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险,或者存在更好的选择
@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息,与前两个注解有所不同,你需要添加一个参数才能正确的使用,这些参数都是定义好了的,我们选择性使用就好了。
@SuppressWarnings("all");
@SuppressWarnings("unchecked");
@SuppressWarnings(value={"unchecked","deprecation"});
我对这几个参数的理解是:
@Override:重写,必须对父类的方法重写
@Deprecated:就是你使用这个注解过的方法或者属性时,它会出现一个中穿线。比如:Date date = new Date("2019-07-11");它可以使用,但是不推荐使用,可能会出现bug
@SuppressWarnings("all"):比如你定义了一个变量,而没有去使用它,它就会提醒你。但是使用这个注解,那么它就是不会提醒你。慎用!!
三、元注解
1、元注解的作用是负责注解其他注解,java定义了四个标准的meta-annotation类型,他们被用来提供对其他annotation类型作说明
2、这些类型和它们所支持的类在java.lang.annotation包中可以找到(@Target,@Retention,@Documented,@Inherited)
@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE
@Documented:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
//Target表示我们的注解可以用在哪些地方
@Target(value={ElementType.METHOD,ElementType.Type})//Retention表示我们的注解在什么地方还有效
@Retention(value=RetentionPolicy.RunTime)//@Documented:表示是否将我们的注解生成灾javadoc中
@Documented//Inherited表示子类可以继承父类的注解
@Inherited
@interfacemyAnnotation{
}
四、自定义注解
1、使用@Interface自定义注解时,自动继承了java.lang.Annotation接口
2、分析:
2.1、@interface用来声明一个注解,格式:public @interface 注解名{自定义的内容}
2.2、其中的每一个方法实际上是声明了一个配置参数
2.3、方法的名称就是参数的名称
2.4、返回值类型就是参数的类型(返回值只能是基本类型,class,String,enum)
2.5、可以通过default来声明参数的默认值
2.6、如果只有一个参数成员,一般参数名为value
2.7、注解元素必须要有值,我们定义注解元素时,经常使用空字符串或者0,作为默认值
例如:
public classTest{//注解可以显示赋值,如果没有默认值,我们必须给注解赋值
@myAnnotation()public voidtest(){
}//Target表示我们的注解可以用在哪些地方
@Target(value={ElementType.METHOD,ElementType.Type})//Retention表示我们的注解在什么地方还有效
@Retention(value=RetentionPolicy.RunTime)//@Documented:表示是否将我们的注解生成灾javadoc中
@Documented//Inherited表示子类可以继承父类的注解
@Inherited
@interfacemyAnnotation{
String name()default "";int id() default 0;
String[] Arr()default{"aaa","bbb"};
}//注意:如果注解只是定义一个参数,可以取名为value,在调时,//value可以省略
}
-
Java注释
2021-02-28 16:01:29Java提供3种注释方式:。单行注释://多行注释/**/文档注释:/***文档注释用于从源代码自动生成文档执行javadoc*命名根据源代码中的内容生成网页*@XXX */不同格式的注释可以嵌套。// Welcome1.java. Text-printing ...注释(commentary )是程序中用于说明和解释的一段文字对程序运行不起作用。程序 中添加注释的目的是增强程序的可读性。
Java提供3种注释方式:。
单行注释://
多行注释/**/
文档注释:
/**
*文档注释用于从源代码自动生成文档执行javadoc
*命名根据源代码中的内容生成网页
*@XXX
*/
不同格式的注释可以嵌套。
// Welcome1.java. Text-printing program.
/*计信学院09软件工程2班
**姓名XXX
**2011年2月26日1800最后修改。*/
public class Welcome1
{
// main method begins execution of application
public static void main( String args[] ){
System.out.println( "梅花香子苦寒来!" );
}
}
文档注释参数说明
@see 生成文档中的“参见xx 的条目”的超链接后边可以加上“类名”、“完整类名”、“完整类名#方法”。可用于类、方法、变量注释。@param 参数的说明。可用于方法注释。@return 返回值的说明。可用于方法注释。@exception 可能抛出异常的说明。可用于方法注释。@version 版本信息。可用于类注释。@author 作者名。可用于类注释。
>javadoc first.java
javadoc命令javadoc [options] [packagenames] [sourcefiles]
-public 仅显示 public 类和成员 -protected 显示 protected/public 类和成员 (缺省)-package 显示 package/protected/public 类和成员-private 显示所有类和成员-d 输出文件的目标目录-version 包含 @version 段-author 包含 @author 段-splitindex 将索引分为每个字母对应一个文件-windowtitle 文档的浏览器窗口标题
Eclipse中JavaDoc的生成方式
在项目列表中选择项目按右键选择Export导出然后在Export(导出)对话框中选择java下的javadoc。
在Javadoc Generation对话框中有两个地方要注意的 1javadoc command:应该选择jdk的bin/javadoc.exe。 2destination:为生成文档的保存路径。
-
Java的注解包,在使用注解的时候导入的jjar包
2022-03-13 12:40:32里边主要是 junit-4.12.jar hamcrest-core-1.3.jar l两个jar包,是使用junit4,单元测试需要导入的包 -
全面解析Java注解
2020-12-22 21:35:39对于Java开发人员来说,在编写代码时,除了源程序以外,我们还会使用Javadoc标签对类、方法或成员变量进行注释,以便使用Javadoc工具生成和源代码配套的Javadoc文档。这些@param、@return等Javadoc标签是注解标签... -
理解java注解的实现原理
2022-05-01 22:08:33从以下4个方面来系统的学习一下java注解 什么是注解 注解的用途 注解使用演示 注解的实现原理 1,什么是注解 注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对...JAVA 注解的基本原理(重点) https://www.cnblogs.com/yangming1996/p/9295168.html
从以下4个方面来系统的学习一下java注解
- 什么是注解
- 注解的用途
- 注解使用演示
- 注解的实现原理
1,什么是注解
注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解
一般常用的注解可以分为三类:
- 一类是Java自带的标准注解,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。
- 一类为元注解,元注解是用于定义注解的注解,包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@Documented(标明是否生成javadoc文档)
- 一类为自定义注解,可以根据自己的需求定义注解
2,注解的用途
在看注解的用途之前,有必要简单的介绍下XML和注解区别,
注解:是一种分散式的元数据,与源代码紧绑定。
xml:是一种集中式的元数据,与源代码无绑定
当然网上存在各种XML与注解的辩论哪个更好,这里不作评论和介绍,主要介绍一下注解的主要用途:
- 生成文档,通过代码里标识的元数据生成javadoc文档。
- 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
- 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
- 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
3,注解使用演示
这边总共定义了4个注解来演示注解的使用
- 定义一个可以注解在Class,interface,enum上的注解,
- 定义一个可以注解在METHOD上的注解
- 定义一个可以注解在FIELD上的注解
- 定义一个可以注解在PARAMETER上的注解
具体代码如下:
/** * 定义一个可以注解在Class,interface,enum上的注解 */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnTargetType { /** * 定义注解的一个元素 并给定默认值 * @return */ String value() default "我是定义在类接口枚举类上的注解元素value的默认值"; }
/** * 定义一个可以注解在METHOD上的注解 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnTargetMethod { /** * 定义注解的一个元素 并给定默认值 */ String value() default "我是定义在方法上的注解元素value的默认值"; }
/** * 定义一个可以注解在FIELD上的注解 */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnTargetField { /** * 定义注解的一个元素 并给定默认值 */ String value() default "我是定义在字段上的注解元素value的默认值"; }
/** * 定义一个可以注解在PARAMETER上的注解 */ @Target({ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnTargetParameter { /** * 定义注解的一个元素 并给定默认值 */ String value() default "我是定义在参数上的注解元素value的默认值"; }
编写一个测试处理类处理以上注解,这边不过多解释,代码中都写了对应的注释如下:
/** * 测试java注解类 */ @MyAnTargetType public class AnnotationTest { @MyAnTargetField private String field = "我是字段"; @MyAnTargetMethod("测试方法") public void test(@MyAnTargetParameter String args) { System.out.println("参数值 === "+args); } public static void main(String[] args) { // 获取类上的注解MyAnTargetType MyAnTargetType t = AnnotationTest.class.getAnnotation(MyAnTargetType.class); System.out.println("类上的注解值 === "+t.value()); MyAnTargetMethod tm = null; try { // 根据反射获取AnnotationTest类上的test方法 Method method = AnnotationTest.class.getDeclaredMethod("test",String.class); // 获取方法上的注解MyAnTargetMethod tm = method.getAnnotation(MyAnTargetMethod.class); System.out.println("方法上的注解值 === "+tm.value()); // 获取方法上的所有参数注解 循环所有注解找到MyAnTargetParameter注解 Annotation[][] annotations = method.getParameterAnnotations(); for(Annotation[] tt : annotations){ for(Annotation t1:tt){ if(t1 instanceof MyAnTargetParameter){ System.out.println("参数上的注解值 === "+((MyAnTargetParameter) t1).value()); } } } method.invoke(new AnnotationTest(), "改变默认参数"); // 获取AnnotationTest类上字段field的注解MyAnTargetField MyAnTargetField fieldAn = AnnotationTest.class.getDeclaredField("field").getAnnotation(MyAnTargetField.class); System.out.println("字段上的注解值 === "+fieldAn.value()); } catch (Exception e) { e.printStackTrace(); } } }
运行结果如下:
类上的注解值 === 我是定义在类接口枚举类上的注解元素value的默认值 参数上的注解值 === 我是定义在参数上的注解元素value的默认值 参数值 === 改变默认参数 方法上的注解值 === 测试方法 字段上的注解值 === 我是定义在字段上的注解元素value的默认值
4,注解的实现原理
以上只抽取了注解的其中几种类型演示,下面让我们一起来看看他们是怎么工作的
让我们先看一下实现注解三要素:
1,注解声明、
2,使用注解的元素、
3,操作注解使其起作用(注解处理器)
注解声明
首先我们让看一下java中的元注解(也就是上面提到的注解的注解),总共有4个如下:
- @Target,
- @Retention,
- @Documented,
- @Inherited
这4个元注解都是在jdk的java.lang.annotation包下面
@Target
Target说明的是Annotation所修饰的对象范围,源码如下:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Target { /** * Returns an array of the kinds of elements an annotation type * can be applied to. * @return an array of the kinds of elements an annotation type * can be applied to */ ElementType[] value(); }
其中只有一个元素ElementType,再看看它的源码如下:
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE, /** * Type parameter declaration * * @since 1.8 */ TYPE_PARAMETER, /** * Use of a type * * @since 1.8 */ TYPE_USE }
ElementType是一个枚举类定义注解可以作用的类型上,上面例子中演示了TYPE,FIELD,METHOD,PARAMETER 4种可以作用的目标
@Retention
定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个元注解可以对 Annotation的“生命周期”限制
@Documented
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员
@Inherited
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
这边针对这个小编专门写了一个例子方便大家理解,在以上MyAnTargetType注解类中增加@Inherited注解,如下:
/** * 定义一个可以注解在Class,interface,enum上的注解 * 增加了@Inherited注解代表允许继承 */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface MyAnTargetType { /** * 定义注解的一个元素 并给定默认值 * @return */ String value() default "我是定义在类接口枚举类上的注解元素value的默认值"; }
增加一个子类ChildAnnotationTest继承AnnotationTest测试如下:
/** * 增加一个子类继承AnnotationTest 演示@Inherited注解允许继承 */ public class ChildAnnotationTest extends AnnotationTest { public static void main(String[] args) { // 获取类上的注解MyAnTargetType MyAnTargetType t = ChildAnnotationTest.class.getAnnotation(MyAnTargetType.class); System.out.println("类上的注解值 === "+t.value()); } }
运行如下:
类上的注解值 === 我是定义在类接口枚举类上的注解元素value的默认值
说明已经获取到了父类AnnotationTest的注解了
如果MyAnTargetType去掉@Inherited注解运行则报错如下:
Exception in thread "main" java.lang.NullPointerException at com.zhang.run.ChildAnnotationTest.main(ChildAnnotationTest.java:17)
使用注解的元素
使用注解没什么好说的就是在你需要的地方加上对应的你写好的注解就行
注解处理器
这个是注解使用的核心了,前面我们说了那么多注解相关的,那到底java是如何去处理这些注解的呢
从getAnnotation进去可以看到java.lang.class实现了AnnotatedElement方法
MyAnTargetType t = AnnotationTest.class.getAnnotation(MyAnTargetType.class);
public final class Class<T> implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement
java.lang.reflect.AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:
- 方法1: T getAnnotation(Class annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
- 方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
- 方法3:boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
- 方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响
-
JAVA注解
2022-01-23 23:16:05Java注解(Annotation)又称Java标注,是JDK5.0引入的一种注释机制 Java语言中的类,构造器,方法,成员变量,参数都可以被注解进行标注 注解的作用 自定义注解 格式 特殊属性 1.仅有一个参数 ... -
Java注释 数据类型和变量
2022-04-14 09:43:34这篇文章我主要介绍变量的概念 ,Java的注释方法,数据类型。 提示:以下是本篇文章正文内容,下面案例可供参考 一、Java注释 Java注释帮助我们更好地理解代码,无论是编写人员还是阅读人员;注释都能让我们更好地... -
java注解 内置注解
2022-04-19 10:29:53java注解 内置注解 重写注释 @Override 不推荐使用该方法或者存在更好的方法 @Deprecated 镇压警告 @SuppressWarnings(“all”) package AnnotationTest.AnnotationTest01; //内置注释 public class Test01 extends... -
todo Java注解
2021-01-25 21:38:521、注解、注释annotation 2、是一种引用数据类型。编译之后也是xxx.class文件 3、怎么自定义注解,语法 [修饰符列表] @interface 注解类型名{ } 4、注解怎么使用 使用时语法格式: @注解类型名 可以出现在:类上、... -
Java注解配置
2021-03-04 01:49:49Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。四个元注解... -
java注解的自定义和使用
2021-03-01 09:15:45针对java不同版本来说,注解的出现是在jdk1.5 但是在jdk1.5版本使用注解必须继续类的方法的重写,不能用于实现的接口中的方法实现,在jdk1.6环境下对于继续和实现都是用。jdk1.5版本内置了三种标准的注解:@Override... -
Java基础学习——java注解的实现原理
2021-01-14 18:38:36Java注解的实现原理 什么是注解 注解的用途 注解的实现原理 1.什么是注解 注解也叫元数据,例如常见的@Override,注解是JDK1.5之后引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部... -
Java注解详解
2022-03-12 19:15:07Java内置注解 @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。 @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。 @SuppressWarnings - 指示... -
java注解--自动生成
2021-11-03 18:48:45-------------- 第四步:点击Define按钮(=>双击弹出的Java方框) 第五步:填写注释模板 /** *@描述 *@参数 $params$ *@返回值 $return$ *@创建人 chenjie *@创建时间 $date$ *@修改人和其它信息 */ -
java常用注释注解
2022-05-10 13:40:16java常用注释注解 -
Java——注解/注释
2022-04-03 15:49:091、注解,或者叫做注释类型,英文单词是:Annotation 2、注解Annotation是一种引用数据类型。编译之后也是生成xxx.class文件。 3、怎么自定义注解呢?语法格式? [修饰符列表] @interface 注解类型名{ } 4... -
Java注解定义及用法
2021-11-22 17:20:22一、什么是注解 Annotation是从 JDK5.0 ...注解是以 @注释名 在代码中存在的, 还可以添加一些参数值,例如:@SuppressWarnings(value=“unchecked”) Annotation在哪里使用? 可以附加在package , class , method -
Java注释和注解的区别
2020-02-20 10:42:06(注解信息处理流程,是注解和注释的重大区别,如果没有注解信息处理流程,则注解毫无意义) 注解的格式: 1) 注解是以”@注释名”在代码中存在,还可以添加一些参数 值,例如@SuppressWarnings... -
Java注解:@see和@link
2022-03-22 11:07:03在写代码的注释时,有时需要把内容相互关联起来,方便在查看的时候,可以直接指向其他的类、属性或方法。比如@deprecated标记的类,需要指向推荐使用的新类时,该注解就很有用了。说白了,他就是可以链接指向代码,... -
java中的注解
2020-12-22 06:25:24注解 1. 注解概述 1.1 注解解释 注释: 解释代码,给程序员看 注解: Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以...