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编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去 ...
随机推荐
- mysql 日期函数大全
对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型. 这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: my ...
- bootstrap 标签页的使用(tab)
<!DOCTYPE html> <html> <head> <title></title> <link rel="style ...
- 管理员技术(七): Linux管理员 综合测试
一.Linux管理员 综合测试 目标: 根据本文提供的练习步骤完成所有练习案例. 方案: 开始练习之前,先依次重置虚拟机环境. [root@room9pc13 ~]# rht-vmctl reset ...
- STM32嵌入式开发学习笔记(五):中断
我们过去了解了用循环实现延时,或用系统滴答计时器实现延时,但这两种方法都有一种问题:会阻塞处理器的运行.下面我们学习一种不阻塞处理器运行其他事件的功能:时钟中断. 所谓中断,就是让处理器放下手头的事情 ...
- springboot接口:CommandLineRunner
springBoot接口:CommandLineRunner 一.作用: 在使用SpringBoot构建项目时,我们通常有一些预先数据的加载.那么SpringBoot提供了一个简单的方式来实现–Com ...
- 2019河北省大学生程序设计竞赛(重现赛)J-舔狗 (拓扑排序)
题目链接:https://ac.nowcoder.com/acm/contest/903/J 题意:给你 n 个舔狗和他喜欢的人,让你俩俩配对(只能和喜欢它的和它喜欢的),求剩下的单身狗数量. 思路: ...
- ASP.Net 第一天笔记 MVC 控制器与视图数据传递注意事项
1.如果方法的参数的名称与表单元素Name属性的值一致的话,会自动填充 2.如果表单元素的Name属性与实体类型中属性一致,那么表单中的数据会自动赋值给实体中的属性 3.控制器中重载的方法 方法前上边 ...
- YApi导入swagger生成的接口
1.swagger的JSON地址,net或netcore开发环境下 2.配置在内网中,localhost请用对应的IP地址替换,在浏览器地址栏中输入以上地址,会返回一个json格式的文档 3.导入 4 ...
- thinkphp5.1、thinkphp6
下载原装:https://packagist.org/packages/topthink/think composer create-project topthink/think tp 6.0.*-d ...
- Bash 脚本 set 命令教程
http://www.ruanyifeng.com/blog/2017/11/bash-set.html set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题.本文介 ...