如何通过反射获得方法的真实参数名(以及扩展研究)( 三 )


class文件可以用一个结构来表示:
如何通过反射获得方法的真实参数名(以及扩展研究)文章插图
这个结构中每一项大致的含义我们来简单说明一下吧(详情请查看虚拟机规范):
开头的magic u4叫做“魔数” , Java虚拟器通过读取这个数来判断当前文件是不是有效的u4代表它是无符号的4个byte , 这个数始终应该是0xCAFEBABE;
minor_version、major_version分别是class文件的次版本和主版本;
u2 constant_pool_count 、cp_info constant_pool[constant_pool_count-1]代表常量池中项目数和代表了常量池本身;
u2 access_flags : 代表class访问标记 , 例如:public protected;
u2 this_class : 代表放置类名在常量池中的索引;
u2 super_class : 代表父类名称在常量池中的索引;
u2 interfaces_count; u2 interfaces[interfaces_count]; 代表所实现的接口集合的大小 , 及接口集合本身;
u2 fields_count; field_info fields[fields_count]; 代表属性集合大小以及属性集合本身;
u2 methods_count; method_info methods[methods_count]; 代表方法集合大小以及方法集合本身;
u2 attributes_count; attribute_info attributes[attributes_count]; java class文件内部属性信息集合大小和内部属性信息集合本身 。 这里提一下 , 我们前面的提到的LocalVariableTable的信息就存储在这里 。
【如何通过反射获得方法的真实参数名(以及扩展研究)】到了这里我们大致回顾一下吧 , 我们从尝试解决反射获得方法参数真实名称开始 , 了解了Java编译参数、Spring自动绑定相关处理原理、jdk8编译参数新特性、以及Java class文件的结构 。 通过这个过程 , 我们看到 , 就一个“自动绑定”这个平常都感觉不到它存在的小功能背后 , 还有这么多深层次的技术在里面 , 由此可见 , Spring之所以如此强大而且易用 , 离不开各类底层技术的支持 , 这就让我想起以前看到过的一位技术博主的标语:“只有深入 , 方能浅出” , 想想确实是这个道理 。