因为工作需求 需要 将 Jar包 中的代码转换成 C++ 代码。那么这个过程有哪些坑呢?
前情提要
Jar 包 要转成 C++ 程序代码.
第一步 自然是反编译:
工具推荐:Idea 自带的反编译工具.
Idea 如何反编译一个Jar包 ?
- 导入jar到项目中
- 左下角的模块列表就能看到了
展开它就能反编译了.
技术点分享
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吧。