在Java中,我们可以使用javap反汇编器来探索Java类和方法。在C++中如何做到这一点?

4

我是新来的,如果我在错误的板块提问违反了社区的任何条款和条件,请原谅。

  • 我想知道在Java中,我们可以通过使用javap来探索Java类方法,如何在C++中做同样的事情?
  • 假设我想查看Java中String类的所有方法,我会使用javap,它会显示所有方法、它们的返回类型、它们的参数数量和数据类型等。
  • 在C++中如何做到这一点?
  • 还有一种命令行方式可以探索Java语言中特定包中所有包和类吗?
  • 例如java** java.awt.*或任何类似的方法来知道特定包中所有包和类。

2
你似乎在问很多不同的问题,我错了吗? - Lightness Races in Orbit
7
C++缺乏任何形式的包和反射。通常情况下,无法找出已编译二进制文件内部的内容。如果你正在处理.dll,则导出表可能包含导出类/方法的名称。如果你可以访问调试信息文件,则它可能包含源代码到二进制的部分映射。基本上就是这些。 - user7860670
1
由于您所尝试的操作没有标准规定,请说明您感兴趣的工具链。 - Quentin
1
我认为你最好的方法是通过阅读头文件来获取所有这些信息。如果你只有一个已编译的库,那么没有简单的方法可以做到这一点。此外,大多数IDE在编码时会显示类似的内容。我不确定我是否正确理解了你的问题。 - Michel
你可以在 .NET 版本的 C++ 中做到这一点,至少在某些情况下。否则,在 C++ 中无法完成。 - zmbq
2个回答

1
我只想知道在Java中,我们可以使用javap探索Java类方法,如何在C ++中做到这一点?对于C ++程序集,您无法获得任何有用的信息。 C ++编译为汇编语言,并且与内存地址、堆栈和其他较低级别的内容一起工作。假设我想查看Java中String类的所有方法,我会使用javap,其中显示了其所有方法、返回类型、参数数量及其数据类型等。如何在C ++中做到这一点?您可以阅读库的文档或浏览库的头文件,因为每个C ++库都有这些。对于Java,您之前提到了javap。就是它了 :)
对于C ++,这实际上取决于您正在使用的编译器工具链。例如,Microsoft Visual C ++具有dumpbin CLI工具,可以提供丰富的信息。但是,您只能获得混淆的名称,这些名称可能或可能不反映程序使用的命名空间和类的结构。
假设使用java ** java.awt.* 或任何类似的方法来了解特定包内所有软件包和类。

...

大多数有关方法、类、命名空间(或Java中的包)的信息可以从相关库的文档中了解。如果您想要源代码,那么您可以免费获取它(对于开源项目),从库供应商购买它(对于闭源项目),或者只是利用文档。

0

你的主要问题是,如果给定一个可执行文件(C++程序的输出),你能否找到其中的成员、函数等。

在C++中这是不可能的。

C++可执行文件包含本地汇编代码。
而在Java中,类文件实际上包含字节码。


不过,这并不是问题的原因。一种语言同样可以编译成字节码而没有任何反射/元数据/等等。问题在于缺乏这些东西,而不是代码是否编译为本机机器代码或字节码。 - underscore_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接