//参数访问修饰,0表示没有修饰
access = 0
name = iiiii
access = 0
name = dddd
access = 0
name = llll
access = 0
由于方法上标有注解,结果如下:
descriptor = Lorg/springframework/context/annotation/Bean;
visible = true
数组类型的属性名称,如下:
name = name
属性值有两个,如下:
name = null
value = cc
name = null
value = dd
简单类型的属性值,如下:
name = initMethod
value = init
由于方法的其中三个参数上也标了注解,结果如下:
//参数位置,第0个参数
parameter = 0
//注解类型名称,@NotNull
descriptor = Ljavax/validation/constraints/NotNull;
//可见性,运行时可见
visible = true
parameter = 1
descriptor = Ljavax/validation/constraints/Null;
visible = true
parameter = 3
descriptor = Ljavax/validation/Valid;
visible = true
以上这些只是部分的输出结果。完整示例代码参见文章末尾,可以自己运行一下仔细研究研究。结尾总结
在业务开发中直接使用ASM的情况肯定较少,一般在框架开发或组件开发时可能会用到。
ASM的使用并不是特别难,多做测试即可发现规律。
我在测试时发现两个值得注意的事情:
只能访问到显式设置注解属性的那些值,对于注解的默认属性值是访问不到的。
要想获取到注解的默认值,需要去访问注解自己的字节码文件,而不是使用注解的类的字节码文件。
只能访问到类型自己定义的信息,从父类型继承的信息也是访问不到的。
也就是说,字节码中只包括在源码文件中出现的信息,字节码本身不处理继承问题。
因此,JVM在加载一个类型时,要加载它的父类型,并处理继承问题。
完整示例代码:https://github.com/coding-new-talking/taste-spring.git
转自:微信公众号“编程新说”
作者:编程新说李新杰
spring系列视频教程:
![b959a948ca22bf02d1b7bf0d53b4d77b.png](https://img-blog.csdnimg.cn/img_convert/b959a948ca22bf02d1b7bf0d53b4d77b.png)
![a59e3b465d8ce41585abe0ab11e61f14.png](https://img-blog.csdnimg.cn/img_convert/a59e3b465d8ce41585abe0ab11e61f14.png)
![a289cc576dbd1fc773967d5da2d83f4c.png](https://img-blog.csdnimg.cn/img_convert/a289cc576dbd1fc773967d5da2d83f4c.png)
推荐阅读:
java钢铁侠-马克51号:两小时入门 Docker!zhuanlan.zhihu.com![731cde9612aa683e8557cf8e9aa8d106.png](https://img-blog.csdnimg.cn/img_convert/731cde9612aa683e8557cf8e9aa8d106.png)