Java利用ASM读取变量值(Field value)问题研究
作者:网络转载 发布时间:[ 2013/2/21 9:45:13 ] 推荐标签:
近在学习Spring源码的过程中,遇到了spring-asm工程的重新打包的问题,于是突然想研究一下asm这个开源字节码操作工具。秉承我的一贯风格,想到啥立马学啥。
对于开源产品,我的一贯风格是通过其官方提供的源码版本管理地址(svn/git等),直接下载新代码,构建Java工程,直接通过工程依赖的方式研究学习。(你说这样跟依赖jar包并且绑定源码比有啥好处? 一般情况下差不多,多是,我可以随时更新代码,可以本地随意修改代码等等呵呵。个人喜好。)
ASM svn地址:
废话不多说,进入正题。我当时想研究的主要问题,是想尝试通过ASM读取到class文件中声明的变量及其值(其实ASM的主要功能应该是动态生成字节码)。其他东西,我认为是可以触类旁通的。所以,我简单阅读了一下其官方文档,发现其tree API还是非常简单易懂,好上手的。所以,立即动手,我先新建了一个待读取的类。叫ForReadClass,内容如下:
/**
* @author lihzh
* @date 2012-4-21 下午10:18:46
*/
public class ForReadClass {
final int init = 110;
private final Integer intField = 120;
public final String stringField = "Public Final Strng Value";
public static String commStr = "Common String value";
String str = "Just a string value";
final double d = 1.1;
final Double D = 1.2;
public ForReadClass() {
}
public void methodA() {
System.out.println(intField);
}
}
然后编写读取类如下:
/**
* @param args
* @author lihzh
* @date 2012-4-21 下午10:17:22
*/
ublic static void main(String[] args) {
try {
ClassReader reader = new ClassReader("cn.home.practice.bean.ForReadClass");
ClassNode cn = new ClassNode();
reader.accept(cn, 0);
System.out.println(cn.name);
List<FieldNode> fieldList = cn.fields;
for (FieldNode fieldNode : fieldList) {
System.out.println("Field name: " + fieldNode.name);
System.out.println("Field desc: " + fieldNode.desc);
System.out.println("Filed value: " + fieldNode.value);
System.out.println("Filed access: " + fieldNode.access);
}
} catch (IOException e) {
e.printStackTrace();
}
代码很简单,并且语义也很清晰。Tree API,顾名思义是根据Class的结构,一层层读取其中的信息。但是,当我打印出值的时候,结果却让我大跌眼镜。所有vlaue都是 null。(注:第一次读取的时候ForReadClass中,只有三个变量,并且既不是final也不是基本数据类型)。
查看接口说明,发现其是从常量池中读取的值,并且要求filed类型必须是Integer/Double/....的。于是我又构造了几个final的和基本数据类型,如上所示。这次终于有值了。有值的都是final并且是基本数据类型的(String类型的必须是String s = "str"方式声明的,如果是new String("str")的也读取不到)。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11