写点什么

John Heintz 谈如何向 Java 注解添加行为

  • 2008-08-15
  • 本文字数:1622 字

    阅读完需:约 5 分钟

将常见可重用的行为以定制注解的方式添加到 Java 应用中是一种非常棒的方式,但如果开发者在决定使用注解的时候能够遵循一些开发标准和最佳实践的话,那就更事半功倍了。比如说在计划使用注释之前,比较一下当前情况下是不是注释真的比内迁代码和接口更为贴切。New Aspects 的 John Heintz 在最近举行的 No Fluff Just Stuff( NFJS )俄亥俄州软件中心研讨会( COSS )上作了一个演讲,讨论了向Java 注解添加行为的多种设计技术。

讲中,John 简要地谈到了字节码和元编程技术,大体介绍了Java 应用中的元数据是如何在早期Java 版本中使用属性文件、XML 到现在逐渐发展到注解上来的过程。他也提到了制定 JSR-175 规范的目的在于为 Java 语言提供元数据工具,比如 Java 5 中就已经添加了注解。

定义注解与定义接口的方式相似(使用 @Interface 类型来声明注解)。注解不仅可以用在包级别上,也可以用在类成员(属性、方法、构造方法),甚至还可以用在方法的局部参数上。

保持策略(retention policy)是实现注解的重要一环,根据数据在内存中保持时间的长短,有三种类型的保持策略:

  • Runtime(一直保留数据,可以通过反射来访问)
  • Class(数据保留在字节码中,无法在运行时访问)
  • Source(编译器不保留该数据)

一些流行框架如 EJB3 Hibernate Spring Seam Struts 2 RIFE JAX-WS 的新版本都开始支持注解。John 论述了处理注解的三种方式:

生成器:
这种注解处理方式是通过读取源代码来产生新的源代码,或修改现存源代码及其它一些文件(XML、文档等等)来实现。生成器主要依赖于容器或其它编码约定,可以在任何保持策略下工作。

使用生成器的例子有注解处理工具(Annotation Processing Tool,即 APT )和处理器、 XDoclet 、Spoon(针对 Java 的扩展编译器)、 APT-Jelly (一个模板库)等。APT 不允许你修改源代码,但对产生辅助文件却有相当大的帮助(像 WSDL、文档)。

字节码转换:
注解处理器对带有注解的类文件进行解析,然后对类做一些设当的修改。此外,他们也能生成其他类型的文件(比如 XML 配置文件)。字节码转换器在离线状态(编译期)、在装载期都能运行,还能在运行时动态运行(使用 JVMTI API)。在 class 或 runtime 这样的保持策略下,它都能运行。

使用字节码转换器的例子有 AspectJ 、Spring、Hibernate、 CGLib Javassist ASM BCEL 等。

运行时反射:
这种方式使用反射 API 以编程的方式在运行阶段检查对象。它主要依赖于容器或其他编码约定,同时也需要 runtime 保持策略。

使用运行时反射的例子有:Java 5 及更新 Java 版本中的反射、 Commons Attributes 。 像 JUnit TestNG 这样的测试框架也使用运行时反射来处理注解。

John 采用一个 Java 示范应用向大家展示了如何结合 APT、Javassist、AspectJ 及反射(使用了 Java 动态代理)等多种设计技术来定制注解。他还展示了如何向类、属性和方法中添加行为,也谈到了如何使用 Aspects 来注解类型和方法。

此外,John 还提到了 Aspect Processing 的好处,如容易实现(需要好工具的支持)、语义细致——可以影响到方法调用,甚至是属性的访问(在这点上,和反射和 APT 不同),还能够集成多个类库的注解,并支持特定的领域抽象。他建议开发人员说,如果 Java 代码可以以接口的方式实现,那就用接口,不要去用注解。他还建议大家不要对所有东西都使用注解,因为 POJO(Plain Old Java Object)要比 HAJO(Heavily Annotated Java Object)好。在演讲中,他列举了其它一些最佳实践准则,比如:

  • 注解要添加在最高层次的抽象上(比如在类和方法这两个层次上,注解要尽量添加在类上面)
  • 在面对规则的时候,尽量使用合适的默认值,而且只对 exception 添加注解。比外,还要尽量少用参数。
  • 将注解作为“规约优于配置”法则的补充(如 Spring)
  • 使用反射来增强现有框架(如测试)
  • 利用 Javassist 和 CGLIB 框架来产生新的对象,对于底层来说,可以提高字节码转换效率
  • 使用 APT 来生成非代码文件

查看英文原文: John Heintz on Adding Behavior to Java Annotations

2008-08-15 13:591571
用户头像

发布了 88 篇内容, 共 272.0 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

开源堡垒机和免费商业堡垒机哪个用的更香?

行云管家

开源 网络安全 免费堡垒机

MacOS高效iOS代码编写工具|AppCode 2023 激活版v2023.2 兼容M1/M2/intel

Rose

AppCode中文 AppCode 2023破解 AppCode密钥 iOS/macOS开发

阿里逆天级调优方案,内部这套Java性能调优实战宝典,堪称教科书

Java 性能优化 JVM 性能调优

Spring Validated 校验框架,让你的项目更简洁,提升开发效率

Java spring Validated

选择小程序第三方开发框架,你需要知道这些

没有用户名丶

从传统 IT 容灾转向“全栈云容灾”|什么是更适合政企的云

云布道师

阿里云

运行Adobe软件遇到“Adobe app is not available”怎么解决

Rose

Adobe软件

完美!京东资深架构师爆肝纯手打700页架构进阶宝典我粉了

Java 架构 亿级流量

字节Java全能手册火了!多线程/网络/性能调优/框架啥都有

Java 微服务 Spring Cloud socket

如何编写一个健壮的 npm 包 | 京东云技术团队

京东科技开发者

npm npm chalk-next 企业号 5 月 PK 榜

如何做好需求管理?华为云需求管理利器CodeArts Req解读

云计算 产品经理 需求管理 华为云

CFS第十二届财经峰会7月举行, 候选品牌:行云管家

行云管家

云计算 商业 财经峰会

ps神经滤镜是干什么的,神经滤镜的功能和作用

Rose

Photoshop 2023下载 ps神经滤镜 Neural Filters滤镜

优质高效!阿里甩出SpringBoot巅峰之作,进阶不二之选

Java Spring Boot 框架

火山引擎DataTester:如何使用A/B测试优化全域营销效果

字节跳动数据平台

AB testing实战 ab测试 A/B测试

iMovie for Mac(专业视频剪辑工具) v10.3.6中文版

Rose

Mac视频剪辑软件 iMovie中文版 iMovie下载 iMovie Mac破解版

浅析 Redis 中 String 数据类型及其底层编码

redis 数据结构 string

OpenHarmony创新赛 | 赛事宣讲会日期重磅官宣!为你带来超详尽的赛事攻略

OpenHarmony开发者

OpenHarmony

百度营销首创CPQL模式,破解汽车营销线索难题

极客天地

Iframe在Vue中的状态保持技术 | 京东云技术团队

京东科技开发者

html Vue iframe 跨域 iframe 企业号 5 月 PK 榜

首站中科院!百度商业AI技术创新大赛开启巡回宣讲

百度Geek说

人工智能 百度 企业号 5 月 PK 榜

前端微服务无界实践 | 京东云技术团队

京东科技开发者

微服务 前端 企业号 5 月 PK 榜 无界

PAI-Diffusion中文模型全面升级,海量高清艺术大图一键生成

阿里云大数据AI技术

人工智能 模型 Stable Diffusion 企业号 5 月 PK 榜

Nautilus Chain开启全球行,普及Layer3概念加速其采用

鳄鱼视界

名不虚传!字节技术官甩出的"保姆级"数据结构与算法笔记太香了

Java 数据结构 算法 LeetCode

TDengine 成功“晋级” Percona Live 2023 银牌赞助商,开发者驻足关注

爱倒腾的程序员

Github标星67.9k的微服务架构以及架构设计模式笔记我粉了

Java 架构 微服务 设计模式

首个机器学习实时特征平台测试基准论文被 VLDB 2023 录取

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

Photoshop2023硬件要求,PS2023最低配置要求

Rose

PS2023 PS2023系统要求 Photoshop2023硬件要求 神经滤镜Neural Filters

顺丰科技携手飞桨自研“智能外呼机器人”,为客户打造优质服务体验

飞桨PaddlePaddle

nlp 语音识别 百度飞桨

万字长文详述ClickHouse在京喜达实时数据的探索与实践 | 京东云技术团队

京东科技开发者

数据库 flink Clickhouse 企业号 5 月 PK 榜

John Heintz谈如何向Java注解添加行为_Java_Srini Penchikala_InfoQ精选文章