Java反射在JVM的实现

Posted 07H_JH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射在JVM的实现相关的知识,希望对你有一定的参考价值。

本文目录

  1. 什么是Java反射,有什么用?
  2. Java Class文件的结构
  3. Java Class加载的过程
  4. 反射在native的实现
  5. 附录

1. 什么是Java反射,有什么用?

反射使程序代码能够接入装载到JVM中的类的内部信息,允许在编写与执行时,而不是源代码中选定的类协作的代码,是以开发效率换运行效率的一种手段。这使反射成为构建灵活应用的主要工具。

反射可以:

  1. 调用一些私有方法,实现黑科技。比如双卡短信发送、设置状态栏颜色、自动挂电话等。
  2. 实现序列化与反序列化,比如PO的ORM,Json解析等。
  3. 实现跨平台兼容,比如JDK中的SocketImpl的实现
  4. 通过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的实现

java启动参数一

07 JVM 是如何实现反射的

《深入理解Java虚拟机》- JVM是如何实现反射的

JVM的反射实现

2java 启动参数

(c)2006-2024 SYSTEM All Rights Reserved IT常识