被迫尝试了各个版本的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

时间: 2024-08-30 14:03:45

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

mfc-在VS13下编写MFC程序,release版本(静态库)在自己电脑可以用,在其他电脑会崩溃。

问题描述 在VS13下编写MFC程序,release版本(静态库)在自己电脑可以用,在其他电脑会崩溃. 我在win8.1+VS13的编译环境下开发了一个mfc的程序,编译了一个静态库的release版本.在自己的电脑上程序跑得很正常.但是如果在其他电脑上跑,一旦使用tcp/ip发送数据,程序就会崩溃有哪个大神可以指导一下吗 解决方案 不同电脑环境不同没有可比性,你可以增加点日志输出来帮助分析.比如说其它电脑是否有防火墙或者杀毒软件会干扰你的程序,是否缺少运行库或者文件.等等. 解决方案二: 加些

visual studio-关于用steptools公司rose库读取step模型的一些问题

问题描述 关于用steptools公司rose库读取step模型的一些问题 怎么用steptools公司的rose库读取step模型,大神能给个例子程序么.研究了好久了还是没思路,steptools官网上提供的软件是配合vs2013的,貌似也不全啊,不知道能不能用,rose库要是用不成了,自己写程序读step模型也行,跪求大神给点指导意见 解决方案 http://wenku.baidu.com/link?url=UCZtUdSeRRl06KqomdT4s1Z65mo2KnCTS4naGI7Qfu

java库 读取文件内容并转换为数组

问题描述 java库读取文件内容并转换为数组 解决方案 解决方案二:基本问题就慢慢一步步来,先读文件,再去想如何转为数组.解决方案三:自己实现或者调用com.google.common.io.Filesapache的工具类.

2017年初绝对想尝试的25个新Android库

虽然是按顺序排列的,但排名不分先后.让我们开始吧! 1. Lottie 这是一个能解析 Adobe After Effects 动画导出的JSON文件并把它们渲染成本地动画的库.在Google Play Store 上有一个示例app. github上超过7500颗星,应该不会错! 2. Toasty 一个创建自定义Toast的库.正如作者所说,这个库是: The usual Toast, but with steroids.  3. StyleableToast 这是另外一个创建自定义Toas

一个使用FFmpeg库读取3gp视频的例子-Android中使用FFmpeg媒体库(三)

原文:http://doandroid.info/?p=497 在续系列文章在32位的Ubuntu 11.04中为Android NDK r6编译FFmpeg0.8.1版-Android中使用FFmpeg媒体库(一)和在Android中通过jni方式使用编译好的FFmpeg库-Android中使用FFmpeg媒体库(二)文章后,本文将根据github中churnlabs的一个开源项目,来深入展开说明如何使用FFmpeg库进行多媒体的开发. 本文中的代码来自于https://github.com/

Swift版本的图片加载类

之前使用OC版本的,都是基于AFN而自行封装的类库, 现在写了一个swift版本的,很方便使用,在些开源出来. 首先是图片下载类: // // HYBImageLoader.swift // OSChinaClient // // Created by 黄仪标 on 15/3/5. // Copyright (c) 2015年 huangyibiao free edu. All rights reserved. // import Foundation import UIKit /// ///

Java使用Apache POI库读取Excel表格文档的示例_java

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 项目下载页:http://poi.apache.org/download.html Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Jav

JustinIO的vb.NET版本!(串口操作类)

Imports SystemImports System.Runtime.InteropServices Namespace JustinIO Class CommPort Public PortNum As String Public BaudRate As Integer Public ByteSize As Byte Public Parity As Byte '// 0-4=no,odd,even,mark,space Public StopBits As Byte '// 0,1,2

Java-类库-Guava-Throwables类

有时候, 当我们我们捕获异常, 并且像把这个异常传递到下一个try/catch块中.Guava提供了一个异常处理工具类, 可以简单地捕获和重新抛出多个异常. import java.io.IOException; import org.junit.Test; import com.google.common.base.Throwables; public class ThrowablesTest { @Test public void testThrowables(){ try { throw