当前位置: 首页 > news >正文

被迫尝试了各个版本的asm库读取类annotation

杯具的写完代码才发现应用原来依赖的cglib使用了1.x的asm库,从最初使用3.x版本到2.x,然后使用1.x才搞定asm的兼容性。这里记录下不同版本如何读取annotation。

asm3.2:
这个版本非常方便,实现ClassVisitor接口,里面有个visitAnnotation方法,方法签名是: AnnotationVisitor visitAnnotation(String desc, boolean visible) ,其中desc是annotation的类型(Lxxx/xxx/xxx;),稍微处理下就可以将java byte code的表示形式变成Annotation的类名;visible表示该annotation是否运行时可见,因为我需要类加载后读取annotation的值,可以通过这个参数来判断。因为我只是用来获取annotation的名字,不需要读取annotation里面的key和value,所以直接返回null就可以了。如果要继续深入解析这个annotation,可以通过实现AnnotationVisitor接口并返回来解析。
asm2.2:
降到了这个版本,是运行时cglib库提示ClassWriter没有传入boolean参数的构造函数,这个应该算是asm升级到3.x之后没有做到向下兼容的一个地方。降级到asm2.2,修改的地方很少,就是ClassReader的accept函数,是否跳过debug信息标签,从int型的flag变成了个boolean型。读取annotation的方法没有变化。
asm1.5.3:
改用了2.2之后,还有运行时错误,木有找到CodeVisitor。只能降级到1.5.3了。降级到这个版本修改上面读取annotation的代码成本还是比较高的,这个版本里面ClassVisitor没有了visitAnnotation这个函数,而是把annotation当成了一个Attribute,所以只能通过visitAttribute函数。不过反而这个版本读取annotation官方有个文档: http://asm.ow2.org/doc/tutorial-annotations.html
当然我不需要这么复杂做动态代理什么的,只是读取annotation的名字。大体上就是,先通过visitAttribute函数,判断当前传入的Attribute是否是RuntimeVisibleAnnotations的实例,如果是就能够获取里面的公有变量annotations(类型是List<Annotation>)。我所需要的annotation名字,就在Annotation对象的type字段。这里的type也是bytecode中的类表示方法,如果需要获取能够直接被Class识别的类名,可以自己做简单的字符串处理,或者:
String type = annotation.type;
Type t = Type.getType(type);
String cname = t.getClassName();
这样来拿到className。
这次对向下兼容深有体会啊~~

转载自:https://coolex.info/blog/192.html

相关文章:

  • 思科推出新一代互联网边界防火墙 助力企业兼顾性能与安全
  • MacBook小技巧
  • 瞧!那个SSD领域的后来者正变为引领者
  • 【转】Data URL和图片,及Data URI的利弊
  • 高效运维最佳实践七字诀,不再憋屈的运维!
  • 报org.hibernate.MappingException: Unknown entity,可能
  • 从世界杯看社交大数据分析如何为行业客户创造价值
  • 前端开发者必备的20个在线工具和指南
  • 轻量函数式 JavaScript:三、管理函数输入
  • javascript视频教程之《ECMA5核心+设计模式》
  • 五家共井(第1届第3题)
  • 为了搞定政策控制 企业需要多少SDN控制器?
  • hibernate调优
  • Ubuntu中update-grub2与update-grub的区别
  • 把LTE用于物联网 高通推出全新调制解调器解决方案
  • 收藏网友的 源程序下载网
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • canvas绘制圆角头像
  • create-react-app做的留言板
  • egg(89)--egg之redis的发布和订阅
  • es的写入过程
  • Hibernate最全面试题
  • Java Agent 学习笔记
  • Linux gpio口使用方法
  • Lsb图片隐写
  • Lucene解析 - 基本概念
  • spark本地环境的搭建到运行第一个spark程序
  • Theano - 导数
  • vue-router的history模式发布配置
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里研究院入选中国企业智库系统影响力榜
  • 飞驰在Mesos的涡轮引擎上
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 基于Android乐音识别(2)
  • 基于遗传算法的优化问题求解
  • 追踪解析 FutureTask 源码
  • 自制字幕遮挡器
  • 如何在招聘中考核.NET架构师
  • 如何正确理解,内页权重高于首页?
  • ​Java并发新构件之Exchanger
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (zhuan) 一些RL的文献(及笔记)
  • (八)Spring源码解析:Spring MVC
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (分布式缓存)Redis哨兵
  • (七)Knockout 创建自定义绑定
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Google的Objective-C编码规范
  • (转)重识new
  • ***监测系统的构建(chkrootkit )
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core 2.1路线图
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 发送邮件