Java自定义Annotation方法
2019独角兽企业重金招聘Python工程师标准>>>
1. 基本语法
Java代码
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
// The @Bind tag.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bind { public String name(); public int time() default 0;
}
以上是一个用于Method级的简单的@Bind注解类,比较有点象接口的结构,事实上,与其它任何Java接口一样,注解也将会编译成class文件。
/** * Use the @Bind tag. */
public class BindCase { @Bind(name="case", time=1) public void method(){ // do something.. } public void method1(){ // do something.. } @Bind(name="case1", time=20) public void method2(){ // do something.. }
}
编写注解处理器:
在 JASE 1.5扩展了了反射机制的API,为我们提供了相应的注解处理器的API,另外还可以通过外部工具 apt 来解析带有注解的Java Code.
public class BindCaseTracker{ private static Logger logger = Logger.getLogger(BindCaseTracker.class); public static void printBindCase(Class<?> bindClass){ assert bindClass != null; for (Method method : bindClass.getDeclaredMethods()){ Bind bind = method.getAnnotation(Bind.class); if (bind == null) continue; // Not found annotation. logger.debug(String.format("Found [%s] Bind Case : %s-%d", method .getName(), bind.name(), bind.time())); } } public static void main(String[] args) { BindCaseTracker.printBindCase(BindCase.class); }
}
/* Output:
[DEBUG] 11-08 14:15 Found [method] Bind Case : case-1
[DEBUG] 11-08 14:15 Found [method2] Bind Case : case1-20
*///~
2. 元注解
在J2SE中内置了三种常用标准注解(Override, Deprecated, SuppressWarnings)以及四种元注解:
@Target: 表示该注解可以用于什么地方。可用ElementType枚举类型主要有: TYPE : 类、接口或enum声明 FIELD: 域(属性)声明 METHOD: 方法声明 PARAMETER: 参数声明 CONSTRUCTOR: 构造方法声明 LOCAL_VARIABLE:局部变量声明 ANNOTATION_TYPE:注释类型声明 PACKAGE: 包声明 @Retention: 表示需要在什么级别保存该注解信息。可用RetentionPolicy枚举类型主要有: SOURCE: 注解将被编译器丢弃。 CLASS : 注解在class文件中可能。但会被VM丢弃。 RUNTIME: VM将在运行时也保存注解(如果需要通过反射读取注解,则使用该值)。 @Documented: 将此注解包含在Javadoc中。 @Inherited: 允许子类继承父类中的注解。
3. 使用技巧
a. 如果希望定义的注解用于多种 ElementType 的话可以写成:
import static java.lang.annotation.ElementType
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
b. 在声明注解中的方法时可通过 default 来指定默认值。
c. 在声明注解中的方法返回类型可结合泛型使用,如:
Class<? extends Payload>[] payload() default {};
d. 可在注解类中定义嵌套注解,如:
import static java.lang.annotation.ElementType @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
public @interface NotNull { String message() default "{javax.validation.constraints.NotNull.message}"; @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented @interface List { NotNull[] value(); }
}
@NotNull.List(value = { @NotNull })
protected List<?> list;
e. 在JASE中提供了很少的内置注解,不过JBoss提供了一个 validation-api 的类库,提供常用验证注解。有兴趣的朋友可以下载看看,其 maven 依赖为:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0</version>
</dependency>
转载于:https://my.oschina.net/stefanzhlg/blog/354908
Java自定义Annotation方法相关推荐
- java自定义一个方法,用于返回两个整数的和
java自定义一个方法,用于返回两个整数的和 /*** 自定义一个方法* 用于返回两个整数的和*/ public class Test17 {public static int getSum(int ...
- 深入理解Java注解Annotation及自定义注解
要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...
- Java自定义注解Annotation的实现原理
文章目录 1.什么是注解? 2.注解的用处: 3.注解的原理: 4.元注解: 5.常见标准的Annotation: 6.自定义注解: 7.自定义注解实例: 1.什么是注解? 对于很多初次接触的开发 ...
- java注释和注解_深入理解JAVA注解(Annotation)以及自定义注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制.Java 语言中的类.方法.变量.参数和包等都可以被标注.注解可以看作是一种特殊的标记,在程序在编译或 ...
- java简单自定义Annotation
为什么80%的码农都做不了架构师?>>> 原文内容比较多,这里就简单地说一下.java 5以后增加了3个annotation, @Override @Deprecated @S ...
- 深入JAVA注解(Annotation):自定义注解
一.基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解 ...
- Java注解Annotation的用法 - 自定义Annotation实现
Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据. Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反射获取标 ...
- Java 注解(Annotation)使用方法归纳
Java注解Annotation使用方法归纳 简介 注解是从JDK5开始支持,是Java对元数据的一种特殊支持.与注释有一定区别,可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等 ...
- java自定义封装一个方法_Java自定义套件封装教程
Java自定义套件封装教程 时间:2017-07-28 来源:华清远见JAVA学院 各位亲爱的小伙伴们大家好,近很多伙伴都问我该怎么做Java自定义套件封装,今天华清Java学院小编在这里做了 ...
最新文章
- 海思3536:PC客户端编译过程报错及解决方法
- Blend_ControlTemplate(Z)
- 通过COS上传文件至腾讯云
- 查看VMware上虚拟机的 ip 地址
- RTX5 | 线程标志组02 - 获取线程标志与清除线程标志
- 算法的时间复杂度[ZT]
- 当我的master被fork后,我把master删了,然后我就成了他人的bitch
- pinpoint 监控mysql_基于Centos7系统安装部署Pinpoint分布式监控
- 拉普拉斯变换公式表_复变函数之拉普拉斯变换小结
- 医疗中文问句意图匹配Top3方案ppt
- [翻译]Monocular Visual Odometry using OpenCV
- VMware资源集合,分享一波
- paip.网站接入QQ登录总结
- 简单高效,分享几款我在使用的效率神器
- 主动轮廓模型snake
- 【从零搭建一个淘宝客公众号02】- 基于koa搭建后台
- android手机如何截屏,安卓手机怎么截图? (全文)
- 万洲金业:黄金ETF如何影响黄金价格?
- 2019中国科大夏令营机试
- 快应用联盟展示入口合集(11月更新)