Java代码转C++代码的几点小经验

2023-10-27


因为工作需求 需要 将 Jar包 中的代码转换成 C++ 代码。那么这个过程有哪些坑呢?

前情提要

Jar 包 要转成 C++ 程序代码.
第一步 自然是反编译:
工具推荐:Idea 自带的反编译工具.

Idea 如何反编译一个Jar包 ?

  1. 导入jar到项目中
    在这里插入图片描述
  2. 左下角的模块列表就能看到了
    展开它就能反编译了.

技术点分享

C++ 和 Java太像,毕竟C++是Java的爹.其实转换并不复杂.
只是有些小坑.

instanceof 的翻译

Java中 instanceof 用于判断某个对象 是否是某个类型.
obj instanceof Color 即 如果 obj 是 Color 类型.

那么C++ 怎么翻译呢?
(typeid(*father)中星号是必不可少的.)
使用typeid 并且要解引用.如下例:

Father * father = new Child();
if(typeid(*father) == typeid(Child)){
cout<< "这是一个Child类型"
}

基础库的翻译

C++ 的基础类 不支持很多函数.eg:
Vector String 有 contains 而 C++ 没有直接的函数.需要 使用std::find的模板函数实现.
或者名字不一样,eg:
indexOf 与 C++ find()
对于以上 种种不同另一个主意是 用 C++ 实现类似的类.

String类 Vector类 Map类

要实现就趁早,别等转换了很多的时候,就没动力再搞了(比如我)

但这只是一个构想,C++ 似乎对 这些标准类 没有提供 虚析构.所以 即使继承也不能 使用 new String来做.(但 我是没有用过 new String)

算法实现 区别

对于算法实现,eg 二分搜索. C++ 也拥有自己的实现库, #include <algorithm>
但需要注意的是 C++ 的标准库STL 与 Java库的返回值 往往不同,需要对比注意.
binary_search为例:
Java >=0 代表成功找到.
C++ true 代表成功找到.

传参的区别

Java传对象就是 传 引用。所以我们经常会看到 只有入参,没有返回值。
如果我们 翻译成 C++的话,就要改成 传引用了.

到处乱传的内存管理问题

Java 是自动回收内存,所以写代码的人 不用劳心去管释放.
建议翻译成 C++ 的时候 不要使用原始指针 直接使用智能指针即可.

数据初始化

float f;//Java 输出的是0,而C++输出的是始终随机数
可见 C++ 还是要初始化的.

类型转换

string str = "1"+0;
std::cout<< str // 这里会输出几?

这也是一个坑. C++ 更喜欢把数据理解成 16进制的原始数据 .而Java则是以文本为优先.
所以正确的翻译应该是:

string str = "1" + to_string(0);

以上就是最近工作中总结出来的一点小经验.
我认为 Java大部分 代码 都可以自动转换成C++.
因为人工转换也不过是 替换替换 再修正一下.

通过解析 Java代码来根据有限规则 进行自动化翻译 并不是一个不可完成的任务.

但说实话,为什么不用Java来转换Java呢? 不就是要改现在的项目吗? 。。。也许前人不太想用Java吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java代码转C++代码的几点小经验 的相关文章

  • 记一次某src得子域名接管漏洞挖掘

    如下案例是fofa找的 在火线资产里直接搜索关键词html noSuchbucket 可以看到显示如下信息
  • 无损剪切音视频文件的跨平台工具: LosslessCut

    mifi lossless cut Stars 17 3k License GPL 2 0 LosslessCut是一款跨平台的FFmpeg GUI工具 它可以对视频 音频和字幕等相关媒体文件进行快速无损操作 该软件最主要的功能是无损剪切和
  • 初识网络原理

    确定不来看看新出炉的知识 目录 1 网络互连 1 1局域网 1 2广域网 2 网络通信基础 2 1IP地址 2 2端口号 3 认识协议 3 1五元组 3 2协议分层 3 3OSI 7层模型 3 4TCP IP5层 或5层 模型 3 5网络设
  • 请求参数默认值多种实现方式

    文章目录 1 直接赋值 2 使用切面实现默认值 自定义注解 切面类 控制层使用 效果展示 3 使用过滤器Filter实现 自定义请求体 自定义过滤器 1 直接赋值 当前页码 private int pageNum 1 每页条数 privat
  • idea快速清理无效类文件

    1 右击选中的项目 如下图所示 2 在弹出框中输入 unused declaration点击选择 如下图所示 3 弹出如下图所示 点击ok 此时需要一段时间 4 结果如下图所示 5 此时 一个个选中 然后双击 有4种处理模式 如下图所示 S
  • 基于Distflow的最优潮流模型(OPF)--模型推导篇

    开篇 前言 自打上期内容火电机组经济调度建模及求解 基础篇推出以后 有小伙伴留言 不考虑潮流问题的经济调度都是耍流氓 作为一个有文化的流氓 我们尝试着为大家科普潮流计算 对于电力系统而言 潮流计算是一个非常复杂且重要内容 如果我们推文中有什
  • 俞敏洪:与其有钱,不如值钱

    很多人一辈子有两个追求 一个是有钱 一个是值钱 有的人运气好 出生在富贵之家 一出生就像贾宝玉一样嘴里含着玉 有钱就不是问题 但有钱解决不了第二个问题 也就是你本人值不值钱的问题 值钱是个人价值的体现 比如你去找一份工作 人家给你开出百万年
  • 链表 List.h

    链表 List h include list h include

随机推荐

  • Android指纹门锁ESP32项目

    本教程中我向您展示如何使用指纹扫描仪Android手机通过ESP32或ESP8266 Wifi或Arduino wifi模块进行门解锁 要创建此项目 您需要ESP32 中继模块 电磁门锁和Android手机 所需零件 源代码 详情参阅 亚图
  • layUI 使用select选择框无法显示出样式,看不到、等解决方案

    我们在写layui代码时候可能遇到这样的问题 明明代码都是从layui官网上复制下来的 却还是会看不到相应的元素 就比如我昨天遇到的一个BUG 代码如上 但是页面上却没有显示出选择框 选择框这里却依然没有结果出现 这个问题困扰了我几个小时
  • js下载base64格式的图片

    步骤 1 创建一个a标签 2 给a标签创建点击事件 3 将base64数据转为Blob类型 4 将a标签的href指向Blob类型数据 5 触发a标签 代码 template vue qr 组件可以自动将 text绑定的url地址转换为二维
  • 【Python零基础入门篇 · 9】:字典的相关操作

    文章目录 字典 键 值 字典的基本格式 字典的定义 键值对 键的唯一性 字典的常见操作一 增删改查 查看元素 根据键名返回值 删除元素 del clear 修改元素 添加元素 字典中的常见操作二 len 求长度 dict keys dict
  • SQL语句:查询数据表的前n行信息

    每种数据库使用的关键字都不一样 每种数据库使用的关键字都不一样 每种数据库使用的关键字都不一样 SQL Server MS Access 语法 TOP SELECT TOP number percent column name s FROM
  • Java 模拟百度翻译

    相信百度翻译对于大家来说并不陌生 本案例要求编写一个程序模拟百度翻译 用户输入英文之后搜索程序中对应的中文 如果搜索到对应的中文就输出搜索结果 反之给出提示 package demo52 import java util HashMap i
  • sv面向对象:类

    写在前面 开始修炼 类是通过代码怎么体现 实例1 定义一个类 systemverilog绿皮书 例5 1简单的 Transaction类 class Transaction bit 31 0 addr crc data 8 class pr
  • Tomcat配置SSL证书

    本地配置ssl证书 为了更好的再服务器上配置ssl证书 先在本上上熟悉流程 本地不需要类似阿里云的证书 借助java的keytool帮助生成离线的证书 keytool genkey alias ceshi storetype PKCS12
  • MVC和MVVM【区别和详解】

    本篇文章的主要内容是给大家讲解一下MVC与MVVM思想之间的区别 希望能对你有所帮助 他们的区别主要在于MVC中Controller 控制层 变成了MVVM中的viewModel 双向数据绑定 MVVM解决了MVC中需要大量操作DOM所带来
  • std : : vector

    一 简介 std vector 的底层实现通常基于动态数组 dynamic array 它是一种连续分配的内存块 允许元素的快速随机访问 下面是 std vector 的一些关键特点和底层实现细节 连续内存块 std vector 内部使用
  • 【从零学习openCV】ubuntu+openCV+qt安装配置

    一 Ubuntu安装 ubuntu是linux的一个发行版本 我想对linux有所了解的人应该都知道 我们直接到官网上下载就好了 是免费使用的 官网下载链接 这里我用的是最新的ubuntu14 04 由于我用的是Mac系统 直接用Vmwar
  • Windows中一些宏的含义

    1 WIN32 WINDOWS WIN32 WINNT WINVER 这三个宏其实都是Windows的版本宏 在Windows 95 98 Me这一分支的OS中 Windows的定义的版本宏是 WIN32 WINDOWS 与此同时 Wind
  • net : 无法将“net”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然 后

    可能是系统的环境变量没有配置好 所以需要在 C Windows System32下才能找到该命令 是执行该命令的意思 net start mysql 无法启动mysql 根据提示解决了问题 改成 net stop mysql80 net s
  • 多个promise并发执行,如果某个promise失败,则尝试重新执行该promise一次,如果还是失败则提示错误

    思路 可以使用 Promise all 和Promise catch 结合的方式来实现多个promise的并发执行 并在某个promise失败时尝试重新执行 首先 将所有的promise放入数组中 并使用Promise all 来同时执行这
  • json-server深入探秘

    JSON Server Get a full fake REST API with zero coding in less than 30 seconds seriously Created with lt 3 for front end
  • 反序列化漏洞攻击原理(Dubbo反序列化漏洞剖析)

    关联文章 给服务端发送自定义类实例序列化数据实现反序列化攻击 一 前言 最近大家都在讨论Dubbo反序列化漏洞问题 想必各个大V也都推送了相关文章 看了下各大文章差不多都是一个套路 两个步骤 第一步开始描述下Dubbo的反序列化漏洞 几乎都
  • UCOSII里面为什么调用OS_ENTER_CRITICAL()或OS_EXIT_CRITICAL()会出错,出错信息为:undeclared identifier `cpu_sr‘

    可以观察到OSTickISR Init 函数内部调用了OS ENTER CRITICAL 和OS EXIT CRITICAL 并且 1 该OSTickISR Init 函数所在的 C文件包含了includes h文件 include inc
  • .NET Core代码保护!.NET Reactor这些保护机制你不得不知道!

    NET Reactor是一个功能强大的代码保护和软件许可系统 适用于为 NET Framework编写的软件 并支持生成 NET程序集的所有语言 NET Reactor迎来了久违的版本更新 进入v6 3 0 0全新时代 支持Blazor保护
  • Open3D 计算点云凸包的体积和表面积

    目录 一 实现依据 二 代码实现 三 结果展示 四 相关链接 一 实现依据 点云的凸包是包含所有点的最小凸集 open3d实现了计算凸包的方法 compute convex hull 这个接口的实现基于Qhull 更多详细内容见 Open3
  • Java代码转C++代码的几点小经验

    文章目录 前情提要 Idea 如何反编译一个Jar包 技术点分享 instanceof 的翻译 基础库的翻译 算法实现 区别 传参的区别 到处乱传的内存管理问题 数据初始化 类型转换 因为工作需求 需要 将 Jar包 中的代码转换成 C 代