Java反射在JVM的实现
Posted 07H_JH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射在JVM的实现相关的知识,希望对你有一定的参考价值。
本文目录
- 什么是Java反射,有什么用?
- Java Class文件的结构
- Java Class加载的过程
- 反射在native的实现
- 附录
1. 什么是Java反射,有什么用?
反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段。这使反射成为构建灵活应用的主要工具。
反射可以:
- 调用一些私有方法,实现黑科技。比如双卡短信发送、设置状态栏颜色、自动挂电话等。
- 实现序列化与反序列化,比如PO的ORM,Json解析等。
- 实现跨平台兼容,比如JDK中的SocketImpl的实现
- 通过xml或注解,实现依赖注入(DI),注解处理,动态代理,单元测试等功能。比如Retrofit、Spring或者Dagger
2. Java Class文件的结构
在*.class文件中,以Byte流的形式进行Class的存储,通过一系列Load,Parse后,Java代码实际上可以映射为下图的结构体,这里可以用javap
命令或者IDE插件进行查看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
typedef struct
u4 magic;
/*0xCAFEBABE*/
u2 minor_version; /*网上有表可查*/
u2 major_version; /*网上有表可查*/
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-
1
];
u2 access_flags;
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];
ClassBlock;
|
- 常量池(constant pool):类似于C中的DATA段与BSS段,提供常量、字符串、方法名等值或者符号(可以看作偏移定值的指针)的存放
- access_flags: 对Class的flag修饰
1 2 3 4 5 6 7 typedef
enum
ACC_PUBLIC =
0x0001
,
ACC_FINAL =
0x0010
,
ACC_SUPER =
0x0020
,
ACC_INTERFACE =
0x0200
,
ACC_ACSTRACT =
0x0400
AccessFlag
- this class/super class/interface: 一个长度为u2的指针,指向常量池中真正的地址,将在Link阶段进行符号解引。
- filed: 字段信息,结构体如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
typedef struct fieldblock
char
*name;
char
*type;
char
*signature;
u2 access_flags;
u2 constant;
union
union
char
Java反射在JVM的实现
|