本集主要讲述@Retention及@Target2个注解,顺带提一下@Documented这个注解
1.关于@Retention这个注解
Retention翻译成中文是“保留”的意思,RetentionPolicy是“保留策略”。
简要描述:指示注解类型的注解要保留多久。如果注解类型声明中不存在 Retention 注解,则保留策略默认为 RetentionPolicy.CLASS。
每一个Retention都要给他一个RetentionType,RetentionType是一个枚举类型(具体可以查看API文档),它有3种取值:SOURCE,CLASS,RUNTIME,区别如下:
(a)SOURCE:表示该注解只会存在于JAVA源文件中,不会编译到class文件里面去,更不会在运行期通过反射的方式获 取到。
(b)CLASS:表示该注解会随着JAVA源代码一起编译到class文件里面去,但不会在运行期通过反射的方式获取到。
(c)RUNTIME:表示该注解会随着JAVA源代码一起编译到class文件里面去,并且会在运行期通过反射的方式获取到。
请看一个示例:
首先定义一个注解:
package com.shengsiyuan.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//注解也可以修饰注解,该注解修饰下面自定义的注解,通过设定
//RetentionPolicy的值为RUNTIME表示该自定义的注解会被编
//译到CLASS文件当中,而且可以在运行期通过反射的方式获取到(具体请查看一遍API文档,很有必要!)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String hello() default "shengsiyuan";
String world();
}
然后定义一个类,用这个Annotation去修饰
package com.shengsiyuan.annotation;
@MyAnnotation(hello = "beijing", world = "shanghai")
public class MyTest
{
//一个方法可以被多个注解所修饰。
@MyAnnotation(hello = "tianjin", world = "shangdi")
@Deprecated
@SuppressWarnings("unchecked")
public void output()
{
System.out.println("output something!");
}
}
接着定义一个类,并通过反射相关API去获得自定义注解的相关信息
package com.shengsiyuan.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
//该类拿到修饰MyTest里方法的Annotation
public class MyReflection
{
public static void main(String[] args) throws Exception
{
MyTest myTest = new MyTest();
Class<MyTest> c = MyTest.class;
Method method = c.getMethod("output", new Class[]{});
//能够进入到if语句里面来说明MyAnnotation的RetentionPolicy的值为Runtime(为什么请查API文档!)
if(method.isAnnotationPresent(MyAnnotation.class))
{
method.invoke(myTest, new Object[]{});
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String hello = myAnnotation.hello();
String world = myAnnotation.world();
System.out.println(hello + ", " + world);
}
//只会得到Myannotation和Deprecated两个Annotation,因为只有这两个Annotation的RetentionPolicy
//的值为Runtime,只有RetentionPolicy的值为Runtime才会在运行期通过反射相关API拿到Annotation的相关信息。
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation : annotations)
{
System.out.println(annotation.annotationType().getName());
}
}
}
2.关于@Target这个注解(建议去读一读API文档,介绍的很详细)
简要描述:指示注解类型所适用的程序元素的种类。如果注解类型声明中不存在 Target 元注解,则声明的类型可以用在任一程序元素上。
每一个Target都要给他一个ElementType,ElementType是一个枚举类型(具体可以查看API文档),它有8种取值:SOURCE,CLASS,RUNTIME,区别如下:
(a)ANNOTATION_TYPE:表示该注解可以去修饰另外一个注解
(b)COUNSTRUCTOR:表示该注解可以修饰构造方法
(c)FIELD:表示该注解可以修饰成员变量
(d)LOCAL_VARIABLE:表示该注解可以修饰局部变量
(e)METHOD:表示该注解可以修饰普通方法
(f)PACKAGE:表示该注解可以修饰包
(g)PARAMETER:表示该注解可以修饰方法参数
(h)TYPE:表示该注解可以修饰类、接口(包括注解类型)或枚举声明
请看示例:
package com.shengsiyuan.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)//表示该自定义注解只能用于修饰方法
public @interface MyTarget
{
String value();
}
接着定义一个类:
package com.shengsiyuan.annotation;
public class MyTargetTest
{
@MyTarget("hello")
public void doSomething()
{
System.out.println("hello world");
}
}
当把该自定义的注解放到方法上面后编译器不报错时,说明我们的实验是成功的(不需要写main方法进行测试)
对以上2个注解的总结:Retention与Target都是注解,Retention与RetentionPolicy搭配,Target与ElementType搭配。
3.关于@Documented(了解就行)
不多做描述,请看示例:
package com.shengsiyuan.annotation;
import java.lang.annotation.Documented;
@Documented //当一个注解被@Documented 修饰后表示被该注解修饰的对象(类或方法或其他)在生成JAVA DOC文档时,该注解会被加到修饰的对象的上面
public @interface DocumentedAnnotation
{
String hello();
}
然后用该注解去修饰某个方法
package com.shengsiyuan.annotation;
public class DocumentedTest
{
@DocumentedAnnotation(hello = "welcome")
public void method()
{
System.out.println("hello world");
}
}
当对DocumentedTest所在的包或工程生成JAVA DOC文档的时候,会发现自定义的注解会出现在method方法的上面
分享到:
相关推荐
串流分屏 - 两台笔记本电脑屏幕共享
tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl
基于java的银行业务管理系统答辩PPT.pptx
TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便
"Turkish Law Dataset for LLM Finetuning" 是一个专为法律领域预训练的大型语言模型(LLM)微调而设计的数据集。这个数据集包含了大量的土耳其法律文本,旨在帮助语言模型更好地理解和处理土耳其法律相关的查询和文档。 该数据集的特点包括: 专业领域:专注于土耳其法律领域,提供了大量的法律文本和案例,使模型能够深入学习法律语言和术语。 大规模:数据集规模庞大,包含了超过1000万页的法律文档,总计约135.7GB的数据,这为模型提供了丰富的学习材料。 高质量:数据经过清洗和处理,去除了噪声和非句子文本,提高了数据质量,使得模型训练更加高效。 预训练与微调:数据集支持预训练和微调两个阶段,预训练阶段使用了大量的土耳其语网页数据,微调阶段则专注于法律领域,以提高模型在特定任务上的表现。 多任务应用:微调后的模型可以应用于多种法律相关的NLP任务,如法律文本摘要、标题生成、文本释义、问题回答和问题生成等。 总的来说,这个数据集为土耳其法律领域的自然语言处理研究提供了宝贵的资源,有助于推动土耳其语法律技术的发展,并为法律专业人士提供更精准的技术支持。通过微调,
农业信息化服务平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
tornado-6.1b2-cp36-cp36m-manylinux2010_i686.whl
计算机NLP_预训练模型文件
随心淘网管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
计算机汇编杂谈-理解其中的原理
基于java的藏区特产销售平台答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
安装包
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
Windows x64 操作系统上安装 Python 3.11 版本对应的dlib库,操作简单,无需pip在下载,再也不怕网络超时等其他不确定错误 使用方法: 1、确保windows x64系统上安装了python,可以用anaconda自带的python 2、确认python版本为3.11版本 3、下载资源解压为dlib-19.24.1-cp311-cp311-win_amd64.whl到本地,cd到对应目录,终端直接输入命令pip install dlib-19.24.1-cp311-cp311-win_amd64.whl 等待安装成功提示就可以用了,非常方便,有使用问题欢迎私信哟!
Jira插件安装包
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
tornado-6.1b2.tar.gz