java annotation应用_Java Annotation高级应用

前言:

在此行文《java annotation高级应用》,具体实例化解释annotation和annotation processing tool(APT)的使用。望能对各位的有所帮助。

一、摘要:

《java annotation高级应用》具体实例化解释annotation和annotation processing tool(APT)的使用。望能对各位的有所帮助。本文列举了用于演示annotation的BRFW演示框架、演示APT的apt代码实例,并对其进行较为深度的分析,希望大家多多提意见。

二、annotation实例分析

1.BRFW(Beaninfo Runtime FrameWork)定义:

本人编写的一个annotation功能演示框架。顾名思义,BRFW就是在运行时取得bean信息的框架。

2.BRFW的功能:

A.源代码级annotation:在bean的源代码中使用annotation定义bean的信息;

B.运行时获取bean数据:在运行时分析bean class中的annotation,并将当前bean class中field信息取出,功能类似xdoclet;

C.运行时bean数据的xml绑定:将获得的bean数据构造为xml文件格式展现。熟悉j2ee的朋友知道,这个功能类似jaxb。

3.BRFW框架:

BRFW主要包含以下几个类:

A.Persistent类:定义了用于修饰类的固有类型成员变量的annotation。

B.Exportable类:定义了用于修饰Class的类型的annotation。

C.ExportToXml类:核心类,用于完成BRFW的主要功能:将具有Exportable Annotation的bean对象转换为xml格式文本。

D.AddressForTest类:被A和B修饰过的用于测试目的的地址bean类。其中包含了地址定义所必需的信息:国家、省级、城市、街道、门牌等。

E.AddressListForTest类:被A和B修饰过的友人通讯录bean类。其中包含了通讯录所必备的信息:友人姓名、年龄、电话、住址(成员为AddressForTest类型的 ArrayList)、备注。需要说明的是电话这个bean成员变量是由字符串类型组成的ArrayList类型。由于朋友的住址可能不唯一,故这里的住址为由AddressForTest类型组成的ArrayList。

从上面的列表中,可以发现A、B用于修饰bean类和其类成员;C主要用于取出bean类的数据并将其作xml绑定,代码中使用了E作为测试类;E中可能包含着多个D。

在了解了这个简单框架后,我们来看一下BRFW的代码吧!

4.BRFW源代码分析:

A.Persistent类:

清单1:

package com.bjinfotech.practice.annotation.runtimeframework;

import java.lang.annotation.*;

/**

* 用于修饰类的固有类型成员变量的annotation

* @author cleverpig

*

*/

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface Persistent {            String value() default "";   }   B.Exportable类:   清单2:   package com.bjinfotech.practice.annotation.runtimeframework;   import java.lang.annotation.*;   /**   * 用于修饰类的类型的annotation   * @author cleverpig   *   */   @Retention(RetentionPolicy.RUNTIME)   @Target(ElementType.TYPE)   public @interface Exportable {            //名称            String name() default "";            //描述            String description() default "";            //省略name和description后,用来保存name值            String value() default "";   }   C.AddressForTest类:   清单3:   package com.bjinfotech.practice.annotation.runtimeframework;   /**   * 用于测试的地址类   * @author cleverpig   *   */   @Exportable("address")   public class AddressForTest {            //国家            @Persistent            private String country=null;            //省级            @Persistent            private String province=null;            //城市            @Persistent            private String city=null;            //街道            @Persistent            private String street=null;            //门牌            @Persistent            private String doorplate=null;            public AddressForTest(String country,String province,                            String city,String street,String doorplate){                    this.country=country;                    this.province=province;                    this.city=city;                    this.street=street;                    this.doorplate=doorplate;            }   }   D.AddressListForTest类:   清单4:   package com.bjinfotech.practice.annotation.runtimeframework;   import java.util.*;   /**   * 友人通讯录   * 包含:姓名、年龄、电话、住址(多个)、备注   * @author cleverpig   *   */   @Exportable(name="addresslist",description="address list")   public class AddressListForTest {            //友人姓名            @Persistent            private String friendName=null;            //友人年龄            @Persistent            private int age=0;            //友人电话            @Persistent            private ArrayList teleph;            //友人住址:家庭、单位            @Persistent            private ArrayList AddressForText=null;            //备注            @Persistent            private String note=null;            public AddressListForTest(String name,int age,                            ArrayList telephoneList,                            ArrayList addressList,                            String note){                    this.friendName=name;                    this.age=age;                    this.teleph ArrayList(telephoneList);                    this.AddressForText=new ArrayList(addressList);                    this.note=note;            }   }   E.ExportToXml类:   清单5:   package com.bjinfotech.practice.annotation.runtimeframework;   import java.lang.reflect.Field;   import java.util.Collection;   import java.util.Iterator;   import java.util.Map;   import java.util.ArrayList;   /**   * 将具有Exportable Annotation的对象转换为xml格式文本   * @author cleverpig   *   */   public class ExportToXml {            /**             * 返回对象的成员变量的值(字符串类型)             * @param field 对象的成员变量             * @param fieldTypeClass 对象的类型             * @param obj 对象             * @return 对象的成员变量的值(字符串类型)             */            private String getFieldValue(Field field,Class fieldTypeClass,Object obj){                    String value=null;                    try{                            if (fieldTypeClass==String.class){                                    value=(String)field.get(obj);                            }                            else if (fieldTypeClass==int.class){                                    value=Integer.toString(field.getInt(obj));                            }                            else if (fieldTypeClass==long.class){                                    value=Long.toString(field.getLong(obj));                            }                            else if (fieldTypeClass==short.class){                                    value=Short.toString(field.getShort(obj));                            }                            else if (fieldTypeClass==float.class){                                    value=Float.toString(field.getFloat(obj));                            }                            else if (fieldTypeClass==double.class){                                    value=Double.toString(field.getDouble(obj));                            }                            else if (fieldTypeClass==byte.class){                                    value=Byte.toString(field.getByte(obj));                            }                            else if (fieldTypeClass==char.class){                                    value=Character.toString(field.getChar(obj));                            }                            else if (fieldTypeClass==boolean.class){                                    value=Boolean.toString(field.getBoolean(obj));                            }                    }                    catch(Exception ex){                            ex.printStackTrace();                            value=null;                    }                    return value;            }            /**             * 输出对象的字段,当对象的字段为Collection或者Map类型时,要调用exportObject方法继续处理             * @param obj 被处理的对象             * @throws Exception             */            public void exportFields(Object obj) throws Exception{                    Exportable exportable=obj.getClass().getAnnotation(Exportable.class);                            if (exportable!=null){                            if (exportable.value().length()>0){   //                                 System.out.println("Class annotation Name:"+exportable.value());                            }                            else{   //                                 System.out.println("Class annotation Name:"+exportable.name());                            }                    }                    else{   //                         System.out.println(obj.getClass()+"类不是使用Exportable标注过的");                    }                    //取出对象的成员变量                    Field[] fields=obj.getClass().getDeclaredFields();                    for(Field field:fields){                            //获得成员变量的标注                            Persistent fieldAnnotation=field.getAnnotation(Persistent.class);                            if (fieldAnnotation==null){                                    continue;                            }                            //重要:避免java虚拟机检查对私有成员的访问权限                            field.setAccessible(true);                            Class typeClass=field.getType();                            String name=field.getName();                            String value=getFieldValue(field,typeClass,obj);                            //如果获得成员变量的值,则输出                            if (value!=null){                                    System.out.println(getIndent()+"\n"                                                    +getIndent()+"\t"+value+"\n"+getIndent()+"");                            }                            //处理成员变量中类型为Collection或Map                            else if ((field.get(obj) instanceof Collection)||                                            (field.get(obj) instanceof Map)){                                    exportObject(field.get(obj));                            }                            else{                                    exportObject(field.get(obj));                            }                    }            }            //缩进深度            int levelDepth=0;            //防止循环引用的检查者,循环引用现象如:a包含b,而b又包含a            Collection

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过命令终端访问本地/局域网/远程的MySQL数据库_访问数据库_连接数据库_登录数据库

文章目录Windows系统下访问本地MySQL数据库访问远程主机的MySQL数据库本地安装了MySQL数据库本地没有安装MySQLLinux系统下退出数据库登录Windows系统下 访问本地MySQL数据库 使用命令终端访问本地MySQL数据库,打开终端直接输入以下命令语句: mysql …

科大讯飞 jason word_2019科大讯飞全球1024开发者节开幕啦

2019年10月24日,属于开发者的共同节日2019科大讯飞全球1024开发者节于合肥滨湖国际会展中心盛大启幕。以“A.I.前进,拼世界”为主题的本届大会,将集结120位行业大咖主题演讲、20场行业分论坛详解全域A.I.,科大讯飞的1024计划3.0、…

多线程线程池的实现java_如何在Java中实现线程池

多线程线程池的实现java线程是独立程序的执行路径。 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable。 多线程是指在一个任务中同时执行两个或多个线程。在多线程中,每个任务可以有多个线程,并且这些线程可以异步或同步…

java timestamp是什么类型_JAVA比较2个Timestamp类型的时间大小-由此引发的思考

今天忽然要对2个Timestamp变量的类型进行比较。没怎么用过,百度发现居然很多都是转换类型的。后面发现Timestamp自己都有方法进行比较。但是百度一堆都是那些要转换类型的。我就想简单的知道2个Timestamp的时间哪个早哪个晚嘛。经过自己的百度的验证,终于…

Windows 使用命令执行 sql 脚本文件

文章目录MySQL 数据库方法一:使用 mysql 命令方法二:使用 source 命令Oracle 数据库MySQL 数据库 方法一:使用 mysql 命令 未配置 MySQL 的环境变量,则需要进入 MySQL 的 bin 目录下才能执行 mysql 命令已配置 MySQL 的环境变量…

windows系统连接同局域网下的其他电脑mysql等服务

一、首先设置被连接的mysql服务的 root 用户及访问权限(必须确保连接用户拥有不限ip访问权限) 参考:https://blog.csdn.net/hkl_Forever/article/details/127543546 二、配置被连接电脑的防火墙、网络共享、设置出入端口规则等 1、打开防火墙…

java中使用jython_将Jython嵌入到您的Java代码库中

java中使用jythonJython是一个使用相当可靠的语法的快速Java脚本的好工具。 实际上,当使用jmx为您的Java应用程序实现一些维护或监视脚本时,它的运行效果非常好。 如果您与其他具有python背景的团队合作,则将python集成到您的java应用程序是…

js如何获取jwt信息_谈房地产公众号如何涨粉?一篇文章让你轻松获取信息

原标题:谈房地产公众号如何涨粉?一篇文章让你轻松获取信息对于房地产企业来说,如何学会运营自己企业的房地产微信公众号是涨粉引流的关键一步,老话说:一步走好,步步稳。值得夸奖的是近几年中高端房地产企业…

java 统计数字个数_统计数字问题(Java)

Description一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中…

Windows 命令终端(CMD)的快捷键

这些快捷键只在Windows系统操作有效,连接远程Linux主机,再操作这些快捷键是无效的,因为连接远程的Linux主机后,你用的是Linux命令终端。 快捷键: F1:按F1逐字显示最后一次执行的命令 F2:按F2会…

java开发plc上位机软件开发_上位机开发之西门子PLC-S7通信实践

写在前面:就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况。然后对于西门子PLC来说,通信方式有很多,下面简单列举一…

boss直聘账号异常登不上_【苹果IOS游戏账号分享】据说是最欢乐的2D冒险游戏?Q萌有趣,好不好玩你说了算——惊奇剑士...

惊奇剑士游戏下载点击下方卡片下载游戏!不会使用请点击《操作指南》↓↓↓↓本游戏是由1群的资源库:“hentai是绅士不是变态” 赞助我们购买的,感谢大家的鼎力支持,二哈替大家感谢下hentai是绅士不是变态。可甜可盐的小哥哥之前还…

jquery 延迟加载代码_延迟加载是一种代码气味

jquery 延迟加载代码您见过那些具有许多属性的巨大物体吗? 这些域对象由于不希望从数据库检索太多信息而在其中使用延迟加载? 我敢打赌你有这种令人怀疑的快乐。 今天,我想与您分享我对它们的印象- 使用延迟加载应被视为一种代码味道&#x…

inotify-java下载_inotify-java-2.1.jar

【实例简介】inotify能够对文件系统进行监控,书上举的例子都是c使用inotify的例子,难道没有Java版吗,肯定有,只不过要自己编译,在网上找到别人的博客有,但是人家不愿意分享,我就只能自己编译了&…

SQL语句执行顺序

文章目录SQL 简介SQL 语句的执行顺序重点SQL 简介 SQL 是 Structured Query Language 的缩写,称为结构化查询语言,SQL 是一种操作关系型数据库的规则,SQL 语句以分号结尾,不区分大小写,建议关键词使用大写。 SQL 语句…

getexternalfilesdir 相册_音乐相册(电子相册制作)V5.2 安卓最新版

音乐相册(电子相册制作)是一个功能强大的电子相册创建工具。最新版本的音乐专辑应用程序可以帮助用户快速创建精美的多媒体专辑视频,并匹配优美的音乐伴奏,使照片更精彩。音乐专辑应用程序支持几乎所有流行的图片格式,并支持导入和导出&#…

jdk 9和jdk8_JDK 9是某些功能的终结

jdk 9和jdk8几天前宣布JDK 9是Feature Complete! 进行切割的许多“功能”是附加功能,但有些是移除功能。 这篇文章介绍了一些从OpenJDK和/或Oracle JDK with Java 9中删除的项目。 JEP 220 (“模块化运行时图像”)的一部分是删除…

二级java题型及分值_2016年全国计算机二级java语言程序设计考试大纲

2016年全国计算机二级java语言程序设计考试大纲2016年3月计算机考试即将在3月26日-29日进行,为了帮助大家顺利通过2016年计算机二级考试,下面百分网小编为大家带来2016年全国计算机二级java语言程序设计考试大纲,供大家参考学习,预…

linux系统下安装jdk教程

一、首先下载linux版本jdk jdk官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html 根据自己的需求,下载不同版本的jdk 2.将下载好的jdk压缩包,通过ftp上传到linux系统的当前用户下,我当前登录的用户为r…

mqtt java_MQTT和Java入门

mqtt javaMQTT(MQ遥测传输)是一种轻量级的发布/订阅消息传递协议。 MQTT在物联网应用程序中得到了广泛使用,因为它被设计为在占用空间小的系统上运行在远程位置。 MQTT 3.1是OASIS标准,您可以在http://mqtt.org/上找到所有信息。…