客户端

对Java注解的三层理解

所在版块: 程序员 2020-01-21 17:09 [复制链接] 查看: 2376|回复: 1
许多程序设计语言都有自己的独门武功,比如C语言可操作内存空间,PHP代码无需编译,Golang有协程。Java自然也有,比如 Write Once,Run Anywhere 能力,纯OO特性,以及(本文的主题)注解。

现代Java程序员真的是太喜欢注解了,以至于在使用其他编程语言时,都忍受不了无法使用注解。对啊,为啥其他语言大多都不支持注解呢?或许这个问题该反过来思考:为啥Java会有注解这种神奇的存在呢?

1. 注解是面向编译的行为

注解是Java1.5引入的特性,用来给代码打一些『标记』,编译器在编译时通过这些『标记』可以执行特定的编译行为。例如,@Override注解会让编译器检查子类的方法是否在父类中有定义,如果父类未定义,编译器就会报错,从而让Bug在编译阶段就能暴露(如下图所示)。除了可以让编译器做一些检查外,注解也可以让编译器生成一些代码,Lombok中的注解就是很好的例子。

2
2. 注解作为代码的配置
虽然注解本身是面向编译器的,但在运行期,Java程序可以通过反射读取到注解信息(如下图所示)。也就是说,注解(就像XML,propertities文件)可以作为Java程序的输入,而且注解本身对代码没有侵入性。认识到这一点,就很容易理解为什么可以用它来代替XML配置了。


与XML配置不同,注解是直接配置在代码中,更接近配置目标,能增强程序的内聚性。对于倍受XML配置折磨的Java程序员来说,注解配置真是一剂良药,解救他们于XML配置的水深火热之中。但其实注解这种分散式配置的管理效率不如xml集中式配置高,两者各有优势。许多框架在实现时,对两种配置方式都会支持,比如MyBatis、Dubbo等。

3. 通过注解实现AOP

AOP (Aspect Oriented Programming),面向切面的编程,通过编译织入代码和运行期间动态代理实现程序功能统一维护的一种技术。AOP是OOP编程思想的延续,它分离了OOP的各种正交问题,降低了O之间的耦合度。AOP有两种实现方式:① 编译期织入(weaving)字节码实现,典型代表是AspectJ;② 运行期通过动态代理实现,典型代表是Spring AOP。编译期直接生成字节码,具体有更好的性能。注解既能面向编译器,又能在运行期读取,所以不管是编译期还是运行期,都可以利用注解来实现AOP。下图一个基于AspectJ实现AOP的例子,实现对方法的无侵入缓存功能。


4. 总结
注解作为Java语言特有的一项能力,它本身只是对代码的一种『标记』,没有侵入性。编译器通过注解可以执行一些特定的编译行为,如代码校验、生成增强代码。在运行期,注解信息可以通过反射被应用程序读取,所以可以用注解来对程序配置。并且,与xml集中式配置相比,注解方式的配置更接近代码,能提高程序的内聚性。除配置外,通过注解实现AOP也是非常典型的应用场景。







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

水果奶娘

沙发
发表于 2020-9-12 15:49:07 | 只看该作者
本晴朗的天空偏下起蒙蒙细雨,云家兄妹想打道回府,偏石翠凤游兴颇高,非得幸运时时彩看看烟雨蒙蒙的天津时时彩湖面,最后推来选去,一致同意周山民带了石翠凤租船下湖,云家兄妹坐在湖边小木房里,喝茶聊天。云重望着十一运夺金两人远去的身影叹道:“周山民是一打着灯笼也难寻的好人,偏我这个傻妹妹看不上。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码关注微信公众号

QQ|Archiver|手机版|小黑屋|mwt-design ( 沪ICP备12041170号-1

GMT+8, 2024-11-22 19:51 , Processed in 0.067787 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回列表