java自定义注释及其信息提取
转自:https://xuwenjin666.iteye.com/blog/1637247
1. 自定义注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Documented; @Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Haha {
String author();
String desc();
String date();
String[] checkPoint();
}
2. 使用自定义注解
public class MyAnnotation {
@Haha(author = "hahaAuthor1",
desc = "hahaDesc",
date="2019-03-01",
checkPoint = {"1","2"}
)
public void useMyAnnotation1(){
System.out.println("MyAnnotation.useMyAnnotation1");
}
@Haha(author = "hahaAuthor2",
desc = "hahaDesc",
date="2019-03-01",
checkPoint = {"1","2"}
)
public void useMyAnnotation2(){
System.out.println("MyAnnotation.useMyAnnotation2");
}
public void notUseAnnotation(){
System.out.println("MyAnnotation.notUseMyAnnotation");
}
}
3. 信息提取
import java.lang.reflect.Method;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson; public class GetMyAnnotatioinInfo {
public static GetMyAnnotatioinInfo info = null; public static GetMyAnnotatioinInfo getInstance(){
if(info == null) info = new GetMyAnnotatioinInfo();
return info;
} public Map<String, String> getAnnotationInfo(Class annotationClass, String annotationField, String className) throws Exception{
Method[] methods = Class.forName(className).getDeclaredMethods(); System.out.println("类中所有方法名");
for(Method m : methods) System.out.println(m.getName()); System.out.println("目标注解名:" + annotationClass.getName() + " 类中使用了目标注解的方法有:");
Map<String, String> map = new HashMap<>();
Gson gson = new Gson();
for (Method m : methods){
if(m.isAnnotationPresent(annotationClass)){
System.out.println(m.getName());
Annotation an = m.getAnnotation(annotationClass);
Method anMethod = an.getClass().getDeclaredMethod(annotationField, null);
Object object = anMethod.invoke(an, null);
map.put(m.getName() + "." + annotationField, gson.toJson(object));
}
}
return map;
} public static void main(String[] args) throws Exception{
GetMyAnnotatioinInfo anInfo = GetMyAnnotatioinInfo.getInstance(); Map<String, String> res = anInfo.getAnnotationInfo(Haha.class, "author", MyAnnotation.class.getName());
res.putAll(anInfo.getAnnotationInfo(Haha.class, "checkPoint", MyAnnotation.class.getName())); System.out.println("以上注释名及内容如下:");
for(Map.Entry<String, String> entry : res.entrySet()){
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
}
4. 执行结果
类中所有方法名
useMyAnnotation2
notUseAnnotation
useMyAnnotation1
目标注解名:Haha 类中使用了目标注解的方法有:
useMyAnnotation2
useMyAnnotation1
类中所有方法名
useMyAnnotation2
notUseAnnotation
useMyAnnotation1
目标注解名:Haha 类中使用了目标注解的方法有:
useMyAnnotation2
useMyAnnotation1
以上注释名及内容如下:
useMyAnnotation1.author = "hahaAuthor1"
useMyAnnotation2.author = "hahaAuthor2"
useMyAnnotation2.checkPoint = ["1","2"]
useMyAnnotation1.checkPoint = ["1","2"]
5. 补充
5.1.注解的定义:Java文件叫做Annotation,用@interface表示。
5.2.元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。
5.3.注解的保留策略:
- @Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含
- @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
- @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
5.4.注解的作用目标:
- @Target(ElementType.TYPE) // 接口、类、枚举、注解
- @Target(ElementType.FIELD) // 字段、枚举的常量
- @Target(ElementType.METHOD) // 方法
- @Target(ElementType.PARAMETER) // 方法参数
- @Target(ElementType.CONSTRUCTOR) // 构造函数
- @Target(ElementType.LOCAL_VARIABLE) // 局部变量
- @Target(ElementType.ANNOTATION_TYPE) // 注解
- @Target(ElementType.PACKAGE) // 包
5.5.注解包含在javadoc中:
- @Documented
5.6.注解可以被继承:
- @Inherited
5.7.注解解析器:用来解析自定义注解。
java自定义注释及其信息提取的更多相关文章
- java自定义注释
一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J2SE5 ...
- JAVA自定义注释(Target,Retention,Documented,Inherit)
java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.l ...
- Java 自定义注释@interface的用法
最简单的待校验的注解定义 @Documented @Constraint(validatedBy = ExistBlankByListValidator.class) @Target({PARAMET ...
- java中自定义注释@interface的用法
一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...
- Java annotation 自定义注释@interface的用法
最近看到很多项目都是用了自定义注解,例如 1.什么是注解? 元数据(metadata),就是指数据的数据,元数据是描述数据的,就像数据库中的,表的字段,每一个 字段描述这个字段下面·的数据的含义,j2 ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- java自定义注解注解方法、类、属性等等【转】
http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...
- Android Studio自定义注释模板及生成JavaDoc
刚开始学习Android,使用了Android Studio IDE.为了将来生产JavaDoc,学习一下如何自定义注释模板. . 自定义注释模板 1. 通过 File –>Settings 或 ...
- java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题
一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...
随机推荐
- golang调用c动态库
golang调用c动态库 简介 golang调用c语言动态库,动态方式调用,可指定动态库路径,无需系统目录下 核心技术点 封装c动态库 go语言调用c代码 实例代码 封装c动态库 头文件 test_s ...
- Docker学习大纲
Docker学习大纲:https://www.cnblogs.com/CloudMan6/p/7637361.html
- .NET HttpWebRequest应用
提供基于HttpWebRequest的请求的应用类,其中包含:get请求(带参或不带参).post请求.文件传输请求 方法的具体说明: PostHttp:post请求,支持三种提交模式:FROM.JS ...
- photoshop7.0 排版一寸照片、2寸照片
说明:必须先照一张一寸电子照片,否则是无法做成 1.本例同样采用photoshop CS5制作,其它版本通用,这里采用上一教程“PS照片处理教程-制作一寸照片并排版”的处理效果图进行排版,首先在PS中 ...
- 多用户远程连接设置(WindowsServer2008/Win7)
一.Windows server2008 1.点击计算机--->右键属性打开系统对话框.进行如图设置. 2.在开始菜单--->运行中输入gpedit.msc打开本地组策略编辑器对话框. 3 ...
- 转载:postman自动设置token(csrf及authorization token)
原文链接: https://knktc.com/2018/06/03/postman-set-token/ 正文引用: 近期在开发一个Django的项目,由于开启了csrf防护,所以需要在请求的hea ...
- Win7下Powershell 由2.0 升级为 5.1
今天在构建脚本的时候老是提示 Windows 7 默认的Powershell是2.0,查看版本 下载 https://www.microsoft.com/en-us/download/details. ...
- .net桌面程序或者控制台程序使用NLog时的注意事项
Nuget添加NLog 添加nlog.config文件,并选择属性->始终复制 不选择始终复制,编译后nlog.config是没有的. 具体使用: private static readonly ...
- Ubuntu搭建交叉编译开发环境
在Linux驱动开发过程中,往往需要搭建交叉编译开发环境,其中,最重要的环节就是安装交叉编译工具链,本文介绍如何在Ubuntu下搭建交叉编译开发环境. 1.官网下载交叉编译工具链 链接如下: http ...
- panda读取Excel
pandas读取Excel的第一种方法 方法一:默认读取第一个表单 import pandas print("\n方法一:") xls_data=pd.read_excel('ce ...