news 2026/3/21 8:24:20

类加载器分析(四)启动类加载器 之 字段

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
类加载器分析(四)启动类加载器 之 字段

类加载器分析(四)启动类加载器 之 字段

字段

一个类会有多个字段,字段的内容如下

比如String类的字段可以通过下述Java程序输出

public static void main(String[] args){ Class<?> stringClass = String.class; System.out.println("java.lang.String 字段信息:"); System.out.println("=========================="); // 获取所有声明的字段(包括private) Field[] fields = stringClass.getDeclaredFields(); System.out.println("字段总数: " + fields.length); System.out.println(); // 详细列出每个字段 for (int i = 0; i < fields.length; i++) { Field field = fields[i]; System.out.println((i + 1) + ". " + field.getName()); System.out.println(" 类型: " + field.getType().getSimpleName()); System.out.println(" 修饰符: " + field.getModifiers()); System.out.println(" 是否是合成字段: " + field.isSynthetic()); System.out.println(); } // 按类别统计 long privateFields = Arrays.stream(fields) .filter(f -> java.lang.reflect.Modifier.isPrivate(f.getModifiers())) .count(); long finalFields = Arrays.stream(fields) .filter(f -> java.lang.reflect.Modifier.isFinal(f.getModifiers())) .count(); System.out.println("统计信息:"); System.out.println("- Private字段: " + privateFields); System.out.println("- Final字段: " + finalFields); }

输出结果如下

java.l ang.String 字段信息:==========================字段总数:111. value 类型: byte[]修饰符:18是否是合成字段:false2. coder 类型: byte 修饰符:18是否是合成字段:false3.hash类型: int 修饰符:2是否是合成字段:false4. hashIsZero 类型: boolean 修饰符:2是否是合成字段:false5. serialVersionUID 类型: long 修饰符:26是否是合成字段:false6. COMPACT_STRINGS 类型: boolean 修饰符:24是否是合成字段:false7. serialPersistentFields 类型: ObjectStreamField[]修饰符:26是否是合成字段:false8. REPL 类型: char 修饰符:26是否是合成字段:false9. CASE_INSENSITIVE_ORDER 类型: Comparator 修饰符:25是否是合成字段:false10. LATIN1 类型: byte 修饰符:24是否是合成字段:false11. UTF16 类型: byte 修饰符:24是否是合成字段:false统计信息: - Private字段:7- Final字段:9

修饰符就是访问权限

3.4.1 字段数量

InstanceKlass中用_fields成员变量描述Java类的字段

class InstanceKlass: public Klass { ... u2 _java_fields_count; // The number of declared Java fields Array<u2>* _fields;

获取和设置字段方法如下

Array<u2>* fields() const { return _fields; }//获取字段集合 void set_fields(Array<u2>* f, u2 java_fields_count) {//设置字段集合 guarantee(_fields == NULL || f == NULL, "Just checking"); _fields = f; _java_fields_count = java_fields_count; }
3.4.2 字段获取时机

设置字段时机是在解析字节码文件完成后设置,gdb调试如下

#0 InstanceKlass::set_fields (this=0x100041ca8, f=0x7fffe88057b8, java_fields_count=11)at /home/jx/src/openjdk/src/hotspot/share/oops/instanceKlass.hpp:451#1 0x00007ffff61a9f38 in ClassFileParser::apply_parsed_class_metadata (this=0x7ffff59fddd0,this_klass=0x100041ca8,java_fields_count=11)at /home/jx/src/openjdk/src/hotspot/share/classfile/classFileParser.cpp:3945#2 0x00007ffff61ae843 in ClassFileParser::fill_instance_klass (this=0x7ffff59fddd0, ik=0x100041ca8,changed_by_loadhook=false,cl_inst_info=...,__the_thread__=0x7ffff0028830)at /home/jx/src/openjdk/src/hotspot/share/classfile/classFileParser.cpp:5272#3 0x00007ffff61ae3da in ClassFileParser::create_instance_klass (this=0x7ffff59fddd0, ###在这里可以看到是创建类,步进可见class_parserchanged_by_loadhook=false,cl_inst_info=...,__the_thread__=0x7ffff0028830)at /home/jx/src/openjdk/src/hotspot/share/classfile/classFileParser.cpp:5228

在栈的第3帧的实现可以看到

//在这一步对字节码文件进行解析,获取对应的字段集合和字段总数 ClassFileParser parser(stream, name, loader_data, &cl_info, ClassFileParser::BROADCAST, // publicity level CHECK_NULL); //解析之后将字段集合和字段总数赋值给ClassFileParser类的下面成员变量 //Array<u2>* _fields; //u2 _java_fields_count; ... //下面的函数会将ClassFileParser的_fields和_java_fields_count赋值给InstanceKlass的_fields和_java_fields_count InstanceKlass* result = parser.create_instance_klass(old_stream != stream, *cl_inst_info, CHECK_NULL);

实际上,真正实现字段获取时在字节码解析阶段,通过gdbClassFileParser类的构造函数调试可发现

ClassFileParser::ClassFileParser(ClassFileStream* stream,
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 23:55:38

基于Python的高校毕业生招聘信息推荐系统设计与实现

一、系统开发背景与核心目标 高校毕业生在求职过程中常面临“信息过载与精准匹配缺失”的双重困境&#xff1a;招聘信息分散于各类平台&#xff0c;毕业生需耗费大量时间筛选有效内容&#xff1b;传统推荐多依赖简单关键词匹配&#xff0c;难以结合专业背景、技能特长、职业规划…

作者头像 李华
网站建设 2026/3/13 22:18:57

【技术教程】前端UI组件库Shadcn/ui

shadcn/ui 详解与实战案例 shadcn/ui 是近年来备受前端开发者青睐的 UI 组件库&#xff0c;与传统 UI 库&#xff08;如 Ant Design、MUI&#xff09;有本质区别。它不是一个通过 npm 安装的第三方依赖包&#xff0c;而是一套可直接复制到项目中的高质量组件源代码&#xff0c…

作者头像 李华
网站建设 2026/3/16 15:12:31

学Simulink——基础微电网场景实例:基于Simulink的主从控制策略在微电网中的应用仿真

目录 手把手教你学Simulink 一、引言:什么是“主从控制”?为什么它适合微电网? 二、系统整体架构 控制层级: 三、关键模块1:主单元 —— V/f 控制实现 原理: Simulink 实现步骤: 四、关键模块2:从单元 —— PQ 控制实现 原理: 控制流程: 五、关键模块3:并…

作者头像 李华
网站建设 2026/3/15 18:34:04

基于SpringBoot与Web的数学库组卷系统设计与实现

一、项目背景与意义 在数学教学与测评中&#xff0c;传统试卷编制存在效率低、题型重复率高、难度把控不准等问题&#xff0c;尤其在中小学教育阶段&#xff0c;教师需花费大量时间筛选题目、调整难度、排版试卷。基于SpringBoot的数学库组卷系统&#xff0c;通过构建标准化题…

作者头像 李华
网站建设 2026/3/15 18:34:03

攻防视角下的网络安全检测技术全景:核心原理与主动防御实践

一&#xff0c;网络安全漏洞 安全威胁是指所有能够对计算机网络信息系统的网络服务和网络信息的机密性&#xff0c;可用性和完整性产生阻碍&#xff0c;破坏或中断的各种因素。安全威胁可分为人为安全威胁和非人为安全威胁两大类。 1&#xff0c;网络安全漏洞威胁 漏洞分析的…

作者头像 李华
网站建设 2026/3/15 18:34:01

告别投稿秒拒!虎贲等考 AI:解锁期刊论文高效发表新姿势

还在为期刊论文投稿反复碰壁&#xff1f;熬了数月写就的论文&#xff0c;却因格式不规范被 desk rejection 秒拒&#xff1b;好不容易改完格式&#xff0c;又因文献引用不权威、论证缺乏数据支撑被审稿人打回&#xff1b;更头疼的是&#xff0c;AI 生成痕迹明显&#xff0c;直接…

作者头像 李华