Annotation详解
转自:http://www.doc88.com/p-995532241886.html
首先我们定义一个简单的注解
- package com.qjy.annotation;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface MyAnnotation1 {
- String value();
- }
java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事。
@interface
java用@interface MyAnnotation1定义一个注解
@Target
表明注解标注位置。
ElementType枚举有:
1)TYPE 类、接口、enum声明
2)FIELD 域、属性声明
3)METHOD 方法声明
4)PARAMETER 参数声明
5)CONSTRUCTOR 构造方法声明
6)PACKAGE 包声明
7)ANNOTATION_TYPE 注释类型声明
8)LOCAL_VARIABLE 局部变量声明
@Retention
表明该注解类的生命周期。
RetentionPolicy枚举有:
1)SOURCE 在源文件中有效
2)CLASS 在class文件中有效
3)RUNNTIME 在运行时有效
只有指定注解RetentionPolicy.RUNNTIME,我们才可以在注解处理器中通过反射读取
@Documented
表明此注解是否包含在javadoc中
接下来,我们定义一个包含两个值的注解
- package com.qjy.annotation;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface MyAnnotation2 {
- String description();
- boolean isAnnotation();
- }
下面我们看下这两个注解的用法
- package com.qjy.annotation;
- @MyAnnotation1(value="this is annotation1")
- public class AnnotationDemo {
- @MyAnnotation2(description="this is Annotation2",isAnnotation=true)
- public void sayhello(){
- System.out.println("hello world");
- }
- }
当我们互换@MyAnnotation1和@MyAnnotation2时,ide会报错,这就是@Target作用啦!
下面我们通过命令行执行:javadoc -d doc *.java,生成javadoc文档。注解MyAnnotation2使用@Documented时,文档方法如下:
如果不使用@Documented时,文档如下:
这就是@Documented作用啦!
下面我们编写一个完整的自定义注解。
第一步:编写一个用于对象赋值的注解
- package com.qjy.annotation;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface ValueBind {
- enum fieldType{STRING,INT};
- fieldType type();
- String value();
- }
第二步:使用注解
- package com.qjy.annotation;
- import com.qjy.annotation.ValueBind.fieldType;
- public class Student {
- private String name = "";
- private int age = 0;
- private String studentid = "";
- public String getName() {
- return name;
- }
- @ValueBind(type=fieldType.STRING,value="aa")
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- @ValueBind(type=fieldType.INT,value="25")
- public void setAge(int age) {
- this.age = age;
- }
- public String getStudentid() {
- return studentid;
- }
- @ValueBind(type=fieldType.STRING,value="101")
- public void setStudentid(String studentid) {
- this.studentid = studentid;
- }
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + ", studentid="
- + studentid + "]";
- }
- }
第三步:编写注解处理器
- package com.qjy.annotation;
- import java.lang.reflect.Method;
- /**
- * 注解处理器
- *
- * @author admin
- *
- */
- public class PersistStudent {
- public static void main(String[] args) throws Exception{
- Object obj = Class.forName("com.qjy.annotation.Student").newInstance();
- //获取类所有方法(包含私有)
- Method[] methodArray = obj.getClass().getDeclaredMethods();
- for(int i = 0; i < methodArray.length; i ++) {
- //如果该方法上存在ValueBind注解
- if(methodArray[i].isAnnotationPresent(ValueBind.class)) {
- ValueBind annotation = methodArray[i].getAnnotation(ValueBind.class);
- String type = String.valueOf(annotation.type());
- String value = annotation.value();
- //根据类型,执行set方法
- if(type.equals("INT")) {
- methodArray[i].invoke(obj, new Integer[]{new Integer(value)});
- } else {
- methodArray[i].invoke(obj, new String[]{value});
- }
- }
- }
- System.out.println(obj.toString());
- }
- }
运行结果为:
- Student [name=aa, age=25, studentid=101]
如果将ValueBind中Retention改为:@Retention(RetentionPolicy.SOURCE)或者@Retention(RetentionPolicy.CLASS),运行结果为:
- Student [name=, age=0, studentid=]
我们就无法通过反射获取注解指定的值。
Annotation详解的更多相关文章
- Java Annotation详解 理解和使用Annotation
系统中用到了java注解: 查了一下如何使用注解,到底注解是什么: (1)创建方法:MsgTrace Java Class==> 在Create New Class中: name:输入MsgTr ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- Java Annotation详解(二): 反射和Annotation
前面一篇文<Java Annotation详解(一): 理解和使用Annotation>中,我们或许会觉得,Annotation注释其实并没有多大的作用,除了几个内建的Annotation ...
- 注解Annotation 详解(转)
要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...
- 转:Java Annotation详解
转载自:http://william750214.javaeye.com/blog/298104 元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致 ...
- Java注解Annotation详解
从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通过使用Annotation,开发人员可 ...
- Swagger Annotation 详解(建议收藏)
转载:https://www.jianshu.com/p/b0b19368e4a8 在软件开发行业,管理文档是件头疼的事.不是文档难于撰写,而是文档难于维护,因为需求与代码会经常变动,尤其在采用敏捷软 ...
- Swagger Annotation 详解
在软件开发行业,管理文档是件头疼的事.不是文档难于撰写,而是文档难于维护,因为需求与代码会经常变动,尤其在采用敏捷软件开发模式的系统中.好的工具能够提高团队沟通效率,保证系统质量以及缩短项目的交付周期 ...
- Java 基础之--注解Annotation详解
自定义注解入门: public @interface Annotation01 { //set default value ""; String value() default & ...
- Java自定义注解Annotation详解
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去 ...
随机推荐
- Ubuntu开放对外端口
1.查看已经开启的端口 sudo ufw status 2.打开80端口 sudo ufw allow 80 3.防火墙开启 sudo ufw enable 4.防火墙重启 sudo ufw relo ...
- linux IPC socket(2)
使用bind来关联地址和套接字 #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, cons ...
- linux环境下安装PHP的OpenSSL扩展
先安装依赖包:yum install openssl openssl-devel 进入PHP安装包里的OpenSSL文件夹,根据个人的安装包位置不同,此处是 cd /home/local/php.5. ...
- SDUTOJ 3374 数据结构实验之查找二:平衡二叉树
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3374.html 题目大意 略. 分析 ...
- cut 从/a/b/c/d/e获取/a/b/c
https://www.cnblogs.com/chenxiaomeng/p/10066821.html two_dir=`echo /a/b/c/d/e/f | cut -d"/" ...
- 【Java多线程系列随笔二】BlockingQueue
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便 ...
- 前端(七)—— 盒模型之display、overflow、隐藏、border、margin、样式支持,层级结构
display.overflow.隐藏.border.margin.样式支持,层级结构 一.盒模型之display 1.三种样式 block 块 inline 内联/行内 inline-block 内 ...
- docker hub的使用
讲自己的镜像推送到docker hub 一.将自己的image上标签 docker tag ubuntu:18.04 username/ubuntu:18.04 二.登陆自己的docker hub d ...
- MFS分布式文件系统【4】客户端的挂载MFS存储空间
挂载基于MooseFS 分布式文件,客户端主机必须安装FUSE软件包(FUSE版本号至少2.6,推荐版本号大于2.7的fuse) [root@master ~]# rpm -qa|grep fuse ...
- [已解决]报错Could not install packages due to an EnvironmentError
安装OpenCV过程中出现错误 代码: pip-conda install -i https://pypi.douban.com/simple/ opencv-python 报错内容如下: Could ...