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

87 篇文章 2 订阅
6 篇文章 0 订阅


因为工作需求 需要 将 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吧。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值