Java自定义注解

Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容。在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解。
Java1.5引入了注解,当前许多java框架中大量使用注解,如hibernate、Jersey、spring。注解作为程序的元数据嵌入到程序当中。注解可以被一些解析工具或者是编译工具进行解析。我们也可以声明注解在编译过程或执行时产生作用。
在使用注解之前,程序源数据只是通过java注释和javadoc,但是注解提供的功能要远远超过这些。注解不仅包含了元数据,它还可以作用于程序运行过程中、注解解释器可以通过注解决定程序的执行顺序。例如,在Jersey webservice 我们为方法添加URI字符串的形式的**PATH**注解,那么在程序运行过程中jerser解释程序将决定该方法去调用所给的URI。
创建Java自定义注解
创建自定义注解和创建一个接口相似,但是注解的interface关键字需要以@符号开头。我们可以为注解声明方法。我们先来看看注解的例子,然后我们将讨论他的一些特性。
package com.journaldev.annotations;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{
String author() default 'Pankaj';
String date();
int revision() default 1;
String comments();
}
这里有四种类型的元注解:
1. @Documented —— 指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API。
2. @Target——指明该类型的注解可以注解的程序元素的范围。该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注解没有出现,那么定义的注解可以应用于程序的任何元素。
3. @Inherited——指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。
4.@Retention——指明了该Annotation被保留的时间长短。RetentionPolicy取值为SOURCE,CLASS,RUNTIME。
Java内建注解
Java提供了三种内建注解。
1. @Override——当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。
2. @Deprecated——当我们希望编译器知道某一方法不建议使用时,我们应该使用这个注解。Java在javadoc 中推荐使用该注解,我们应该提供为什么该方法不推荐使用以及替代的方法。
3. @SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息,例如在泛型中使用原生数据类型。它的保留策略是SOURCE(译者注:在源文件中有效)并且被编译器丢弃。
我们来看一个java内建注解的例子参照上边提到的自定义注解。
package com.journaldev.annotations;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
public class AnnotationExample {
public static void main(String[] args) {
}
@Override
@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 1)
public String toString() {
return 'Overriden toString method';
}
@Deprecated
@MethodInfo(comments = 'deprecated method', date = 'Nov 17 2012')
public static void oldMethod() {
System.out.println('old method, don't use it.');
}
@SuppressWarnings({ 'unchecked', 'deprecation' })
@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 10)
public static void genericsTest() throws FileNotFoundException {
List l = new ArrayList();
l.add('abc');
oldMethod();
}
}
相信这个例子可以不言自明并能展示在不同场景下的应用。
Java注解解析
我们将使用反射技术来解析java类的注解。那么注解的RetentionPolicy应该设置为RUNTIME否则java类的注解信息在执行过程中将不可用那么我们也不能从中得到任何和注解有关的数据。
package com.journaldev.annotations;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class AnnotationParsing {
public static void main(String[] args) {
try {
for (Method method : AnnotationParsing.class
.getClassLoader()
.loadClass(('com.journaldev.annotations.AnnotationExample'))
.getMethods()) {
// checks if MethodInfo annotation is present for the method
if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {
try {
// iterates all the annotations available in the method
for (Annotation anno : method.getDeclaredAnnotations()) {
System.out.println('Annotation in Method ''+ method + '' : ' + anno);
}
MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
if (methodAnno.revision() == 1) {
System.out.println('Method with revision no 1 = '+ method);
}
} catch (Throwable ex) {
ex.printStackTrace();
}
}
}
} catch (SecurityException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
运行上面程序将输出:
Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012) Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString() Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated() Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012) Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod() Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest
以上就是java 自定义注解的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java自定义注解
# Java自定义注解的详解
# java自定义注解接口实现方案
# 创建自定义的Java注解类的方法
# Java 自定义注解的魅力
# Java注解Annotation与自定义注解详解
# javaSE基础java自定义注解原理分析
# 自定义
# 或者是
# 内建
# 类中
# 推荐使用
# 当我们
# 我们应该
# 过程中
# 作用于
# 在这个
# 不言自明
# 如有
# 我们可以
# 可以通过
# 也将
# 希望能
# 此类
# 三种
# 将被
# 仅仅是
相关文章:
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
小型网站建站如何选择虚拟主机?
高防服务器如何保障网站安全无虞?
如何获取上海专业网站定制建站电话?
如何快速搭建高效简练网站?
如何快速打造个性化非模板自助建站?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何通过二级域名建站提升品牌影响力?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
建站之星伪静态规则如何设置?
建站主机与虚拟主机有何区别?如何选择最优方案?
Android自定义控件实现温度旋转按钮效果
网站企业制作流程,用什么语言做企业网站比较好?
网站制作模板下载什么软件,ppt模板免费下载网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
在线制作视频的网站有哪些,电脑如何制作视频短片?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
建站之星导航配置指南:自助建站与SEO优化全解析
创业网站制作流程,创业网站可靠吗?
再谈Python中的字符串与字符编码(推荐)
表情包在线制作网站免费,表情包怎么弄?
广州建站公司哪家好?十大优质服务商推荐
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何快速重置建站主机并恢复默认配置?
建站之星多图banner生成与模板自定义指南
专业公司网站制作公司,用什么语言做企业网站比较好?
如何快速生成专业多端适配建站电话?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
建站之星ASP如何实现CMS高效搭建与安全管理?
模具网站制作流程,如何找模具客户?
建站之星代理费用多少?最新价格详情介绍
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
如何基于PHP生成高效IDC网络公司建站源码?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
西安大型网站制作公司,西安招聘网站最好的是哪个?
如何确保西部建站助手FTP传输的安全性?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
英语简历制作免费网站推荐,如何将简历翻译成英文?
建站主机服务器选购指南:轻量应用与VPS配置解析
建站主机选购指南:核心配置与性价比推荐解析
名字制作网站免费,所有小说网站的名字?
建站之星伪静态规则如何正确配置?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
*请认真填写需求信息,我们会在24小时内与您取得联系。