openjdk17 C++源码是怎么给java字段赋值的
##java源码
public class OtherClass {public static int CONSTANT_O=9876;public int o=1234;public void dddd(){String dddd = "dddd";//System.out.println(dddd);System.out.println(dddd+CONSTANT_O);}}
public int o=1234;
在openjdk17中 C++源码怎么执行这段代码的,字节码sipush ,putfield #2
##字节码
public OtherClass();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: aload_05: sipush 12348: putfield #2 // Field o:I11: returnLineNumberTable:line 1: 0line 4: 4
##C++源码
// This function is the interface to the assembly code. It returns the resolved
// cpCache entry. This doesn't safepoint, but the helper routines safepoint.
// This function will check for redefinition!
JRT_ENTRY(void, InterpreterRuntime::resolve_from_cache(JavaThread* current, Bytecodes::Code bytecode)) {switch (bytecode) {case Bytecodes::_getstatic:case Bytecodes::_putstatic:case Bytecodes::_getfield:case Bytecodes::_putfield:resolve_get_put(current, bytecode);break;case Bytecodes::_invokevirtual:case Bytecodes::_invokespecial:case Bytecodes::_invokestatic:case Bytecodes::_invokeinterface:resolve_invoke(current, bytecode);break;case Bytecodes::_invokehandle:resolve_invokehandle(current);break;case Bytecodes::_invokedynamic:resolve_invokedynamic(current);break;default:fatal("unexpected bytecode: %s", Bytecodes::name(bytecode));break;}
}
JRT_ENDvoid InterpreterRuntime::resolve_get_put(JavaThread* current, Bytecodes::Code bytecode) {// resolve fieldfieldDescriptor info;LastFrameAccessor last_frame(current);constantPoolHandle pool(current, last_frame.method()->constants());methodHandle m(current, last_frame.method());bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_nofast_putfield ||bytecode == Bytecodes::_putstatic);bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic);{JvmtiHideSingleStepping jhss(current);JavaThread* THREAD = current; // For exception macros.LinkResolver::resolve_field_access(info, pool, last_frame.get_index_u2_cpcache(bytecode),m, bytecode, CHECK);} // end JvmtiHideSingleStepping// std::cout << "@@@@yym%%%%field" << info.name()->as_C_string() << ":offset:" << info.offset() << std::endl;// check if link resolution caused cpCache to be updatedConstantPoolCacheEntry* cp_cache_entry = last_frame.cache_entry();if (cp_cache_entry->is_resolved(bytecode)) {// std::cout << "@@@@yym%%%%field is_resolved" << info.name()->as_C_string() << ":result:" << "true" << std::endl;return;}// compute auxiliary field attributesTosState state = as_TosState(info.field_type());// Resolution of put instructions on final fields is delayed. That is required so that// exceptions are thrown at the correct place (when the instruction is actually invoked).// If we do not resolve an instruction in the current pass, leaving the put_code// set to zero will cause the next put instruction to the same field to reresolve.// Resolution of put instructions to final instance fields with invalid updates (i.e.,// to final instance fields with updates originating from a method different than <init>)// is inhibited. A putfield instruction targeting an instance final field must throw// an IllegalAccessError if the instruction is not in an instance// initializer method <init>. If resolution were not inhibited, a putfield// in an initializer method could be resolved in the initializer. Subsequent// putfield instructions to the same field would then use cached information.// As a result, those instructions would not pass through the VM. That is,// checks in resolve_field_access() would not be executed for those instructions// and the required IllegalAccessError would not be thrown.//// Also, we need to delay resolving getstatic and putstatic instructions until the// class is initialized. This is required so that access to the static// field will call the initialization function every time until the class// is completely initialized ala. in 2.17.5 in JVM Specification.InstanceKlass* klass = info.field_holder();bool uninitialized_static = is_static && !klass->is_initialized();bool has_initialized_final_update = info.field_holder()->major_version() >= 53 &&info.has_initialized_final_update();assert(!(has_initialized_final_update && !info.access_flags().is_final()), "Fields with initialized final updates must be final");Bytecodes::Code get_code = (Bytecodes::Code)0;Bytecodes::Code put_code = (Bytecodes::Code)0;if (!uninitialized_static) {get_code = ((is_static) ? Bytecodes::_getstatic : Bytecodes::_getfield);if ((is_put && !has_initialized_final_update) || !info.access_flags().is_final()) {put_code = ((is_static) ? Bytecodes::_putstatic : Bytecodes::_putfield);}}// std::cout << "@@@@yym%%%%field" << info.name()->as_C_string() << ":offset:" << info.offset() << std::endl;// std::string str1 = "o";// const char* cStr = info.name()->as_klass_external_name(); // std::string str2(cStr); // 使用构造函数进行转换// if (str1.compare(str2) == 0) {// std::cout << "field name The strings are equal." << std::endl;// std::cout << "@@@@yym%%%%field" << info.name()->as_C_string() << ":offset:" << info.offset() << std::endl;// }// std::string str3 = "CONSTANT_O";// const char* cStr1 = info.name()->as_klass_external_name(); // std::string str4(cStr1); // 使用构造函数进行转换// if (str3.compare(str4) == 0) {// std::cout << "CONSTANT_O name The strings are equal." << std::endl;// std::cout << "@@@@yym%%%%field" << info.name()->as_C_string() << ":offset:" << info.offset() << std::endl;// }cp_cache_entry->set_field(get_code,put_code,info.field_holder(),info.index(),info.offset(),state,info.access_flags().is_final(),info.access_flags().is_volatile());
}
相关文章:
openjdk17 C++源码是怎么给java字段赋值的
##java源码 public class OtherClass {public static int CONSTANT_O9876;public int o1234;public void dddd(){String dddd "dddd";//System.out.println(dddd);System.out.println(ddddCONSTANT_O);}} public int o1234; 在openjdk17中 C源码怎么执行这段代码…...
C++初阶(八)--内存管理
目录 引入: 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数(重要点进行讲解) …...
C# 企业微信机器人推送消息 windows服务应用程序的使用
C# 企业微信机器人推送消息 先添加一个机器人! 然后查看机器人就可以得到一个 webhook 特别特别要注意:一定要保护好机器人的webhook地址,避免泄漏! 然后开始写代码 ,只需要httpPost 调用一下这个地址就可以发送消息了。 首先我…...
社区交流系统设计与实现
社区交流系统设计与实现 1. 系统概述 社区交流系统是一个基于PHP和SQL的Web应用程序,旨在为用户提供一个互动交流的平台。该系统允许用户注册、发布帖子、回复帖子、查看其他用户的帖子和回复,以及管理个人资料,提高用户之间的互动和信息共享…...
【模型学习之路】手写+分析bert
手写分析bert 目录 前言 架构 embeddings Bertmodel 预训练任务 MLM NSP Bert 后话 netron可视化 code2flow可视化 fine tuning 前言 Attention is all you need! 读本文前,建议至少看懂【模型学习之路】手写分析Transformer-CSDN博客。 毕竟Bert是tr…...
Redis学习文档(常见面试题)
目录 Redis回收使用的是什么算法? Redis如何做大量数据插入? 为什么要做Redis分区? 你知道有哪些Redis分区实现方案? Redis分区有什么缺点? Redis持久化数据和缓存怎么做扩容? 分布式Redis是前期做还…...
【C++刷题】力扣-#594-最长和谐子序列
题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的 子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变…...
MoveIt 控制自己的真实机械臂【2】——编写 action server 端代码
完成了 MoveIt 这边 action client 的基本配置,MoveIt 理论上可以将规划好的 trajectory 以 action 的形式发布出来了,浅浅尝试一下,在 terminal 中运行 roslaunch xmate7_moveit_config_new demo.launch 报错提示他在等待 xmate_arm_control…...
C#制作学生管理系统
定义学生类 定义一个简单的类来表示学生,包括学号、姓名、性别、年龄、电话、地址。再给其添加一个方法利于后续添加方法查看学生信息。 //定义学生类 public class student {public int ID { get; set; }//开放读写权限public string Name { get; set; }public i…...
python Pandas合并(单元格、sheet、excel )
安装 Pandas 和 openpyxl 首先,确保已经安装了 Pandas 和 openpyxl。可以通过 pip 安装: pip install pandas openpyxl 创建 DataFrame import pandas as pd # 创建 DataFrame df1 pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [25, 30, 35]…...
OJ在线编程常见输入输出练习【JavaScript】
(注:本文是对【JavaScript Node 】 ACM模式,常见输入输出练习相关内容的介绍!!!) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 一、ACM模式下的编辑页面 二、ACM模式下&a…...
新能源汽车空调系统:绿色出行的舒适保障
在新能源汽车迅速发展的今天,空调系统作为提升驾乘舒适度的重要组成部分,发挥着不可或缺的作用。新能源汽车空调系统主要由压缩机、冷凝器、节流装置和蒸发器四大件组成,它们协同工作,为车内提供适宜的温度和湿度环境。 一、压缩…...
Date工具类详细汇总-Date日期相关方法
# 1024程序员节 | 征文 # 目录 简介 Date工具类单元测试 Date工具类 简介 本文章是个人总结实际工作中常用到的Date工具类,主要包含Java-jdk8以下版本的Date相关使用方法,可以方便的在工作中灵活的应用,在个人工作期间频繁使用这些时间的格…...
TMUX1308PWR规格书 数据手册 具有注入电流控制功能的 5V 双向 8:1单通道和 4:1 双通道多路复用器芯片
TMUX1308 和 TMUX1309 为通用互补金属氧化物半导体 (CMOS) 多路复用器 (MUX)。TMUX1308 是 8:1单通道(单端)多路复用器,而 TMUX1309 是 4:1 双通道(差分)多路复用器。这些器件可在源极 (Sx) 和漏极 (Dx) 引脚上支持从 …...
证件照怎么换底色?简单又快速!不看后悔
一、引言 证件照在我们的生活中有着广泛的应用,无论是求职、考试还是办理各种证件,都需要用到不同底色的证件照。传统的换底色方法往往比较复杂,需要一定的专业技能和软件操作经验。但是现在,有了更简单快捷的方法,让你…...
Rust 基础语法与常用特性
Rust 跨界:全面掌握跨平台应用开发 第一章:快速上手 Rust 1.2 基础语法与常用特性 1.2.1 数据类型与控制流 数据类型 Rust 提供了丰富的内置数据类型,主要分为标量类型和复合类型。 标量类型 标量类型表示单一的值,Rust 中…...
一、开发环境的搭建
环境搭建步骤: 下载软件安装软件运行软件 其他: Visual studio 安装包文件:https://www.alipan.com/s/nd5RgzD4e3b 下载软件 在浏览器中搜索Visual studio,选择如图的选项 点击该区域,进入该页面,【或…...
Docker:存储原理
Docker:存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层,轻量且高效的文件系统。其将整个文件系统分为多个层,层与层之间进行覆盖&#x…...
ts:数组的常用方法(push、pop、shift、unshift、splice、slice)
前端css中filter的使用 一、主要内容说明二、例子(一)、push方法(尾添加)1.源码1 (push方法)2.源码1运行效果 (二)、pop方法(尾删除)1.源码2(pop方…...
物联网网关确保设备安全
物联网(IoT)网关在确保设备安全方面扮演着至关重要的角色。 作为连接物联网设备和云端或企业系统的中介,物联网网关可以实施多种安全措施来保护设备和数据。 是物联网网关确保设备安全的关键方法: 1. 设备认证和授权 认证&…...
RevokeMsgPatcher终极指南:3分钟实现微信/QQ/TIM永久防撤回
RevokeMsgPatcher终极指南:3分钟实现微信/QQ/TIM永久防撤回 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitco…...
3款精选工具:重新定义你的星露谷物语体验
3款精选工具:重新定义你的星露谷物语体验 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods 你是否曾在《星露谷物语》中为重复性的农场劳作感到疲惫?是否因为繁琐的…...
从零解构:BUUCTF“吹着贝斯扫二维码”中的隐写与编码链
1. 题目背景与核心挑战 第一次看到BUUCTF这道"吹着贝斯扫二维码"的题目时,我盯着那堆杂乱的文件陷入了沉思。这道题完美展现了CTF比赛中典型的"隐写多层编码"组合拳——就像侦探破案需要同时处理物证和密码本。题目给出的初始材料是一个加密的f…...
SM3国密算法实战:从原理到Java代码实现与数据完整性校验
1. SM3国密算法:你的数据安全守门人 第一次听说SM3算法时,我正在处理一个政府项目的投标文件加密需求。客户明确要求必须使用国密标准算法,当时我对这类算法还停留在"听说过但没用过"的阶段。经过两周的实战摸索,我发现…...
从栅格到矢量:基于ArcScan的河道中心线智能提取与精度优化实践
1. 从栅格到矢量的技术背景 河道中心线提取是水文分析中的基础性工作。传统人工勾绘方式效率低下,一条10公里长的河道可能需要耗费专业人员半天时间。而基于ArcScan的自动化提取方法,能将这个时间缩短到10分钟以内,同时保证亚米级精度。 我在…...
企业级应用awesome-stock-resources:商业项目合规使用终极指南
企业级应用awesome-stock-resources:商业项目合规使用终极指南 【免费下载链接】awesome-stock-resources :city_sunrise: A collection of links for free stock photography, video and Illustration websites 项目地址: https://gitcode.com/gh_mirrors/aw/awe…...
在Python项目中实现通过Taotoken轮询调用多个大模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Python项目中实现通过Taotoken轮询调用多个大模型 基础教程类,面向中高级开发者。当你在构建一个需要灵活调用不同大…...
国产多模态大模型“书生”全解析:从邱锡鹏团队到产业未来
国产多模态大模型“书生”全解析:从邱锡鹏团队到产业未来 引言 在ChatGPT引爆全球AI热潮的背景下,国产大模型如何突围?由复旦大学邱锡鹏教授领衔、上海人工智能实验室打造的「书生」(InternLM)系列,以其独…...
群晖DSM 7.2.2视频站恢复指南:三步搞定Video Station完整功能
群晖DSM 7.2.2视频站恢复指南:三步搞定Video Station完整功能 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 and DSM 7.3 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 还在为升级到…...
[特殊字符] 论文查重居然能白嫖?这个AI工具的底层逻辑,今天给你讲透
同学们,我是你们的论文写作科普老友。 今天这期不教写作技巧,专门来聊一个所有人写完论文都绕不开、却很少有人真正搞懂的东西——查重。 你肯定遇到过这种场景:论文写了两万字,满怀信心提交查重,结果报告一出来&…...
