2

从一些类的源代码中我看到一些方法包含一个编译代码,它们在扩展之前看起来像这样:

public void someMethod(){
Compiled Code
}

扩展该方法时,您可以看到其中的代码是作为注释编写的。

请参阅以下方法之一sun.awt.shell.ShellFolder

    public boolean isFileSystem() {
     // <editor-fold defaultstate="collapsed" desc="Compiled Code">
     /* 0: aload_0
     * 1: invokevirtual #362  // Method getPath:()Ljava/lang/String;
     * 4: ldc           #7    // String ShellFolder
     * 6: invokevirtual #342  // Method java/lang/String.startsWith:(Ljava/lang/String;)
      /........
   */
      // </editor-fold>
    }

我有兴趣了解更多关于这些方法和使用什么语言的信息。
是否可以编写我自己的编译代码?

4

2 回答 2

10

那也是 Java(或另一种与 JVM 兼容的语言,根据评论)。

当您获得一个 jar 文件(例如带有 JDK/JRE 的 rt.jar)时,它已经被编译。高级代码,例如:

HashMap<Foo, Bar> baz=Quuz.getInstance(); //This is obviously fake

被转换为人类不可读的低级字节码。

此字节码包含元数据,例如方法参数类型,以及加载这些类和方法所需的信息。IDE 需要为库(例如添加到项目类路径的 jars)提供语法补全,更重要的是加载和使用从这些库中获得的类的方法。

您在此处看到的“代码”是一个摘要,是一种称为字节码的代码。逐行,如ldc您的示例中所示的指令在一次为 JVM 提供动力的堆栈的一小部分上运行。这个字节码很难手动读取和编程,所以你的编译器会为你生成它。

所有这些(除了一些本机方法)都是用 JVM 兼容的语言实现的。

根据库及其限制以及您的 IDE 的功能,可能会在另一个包中获取完整的源代码并“附加”它,以便您的 IDE 显示源代码而不是机器生成的摘要,或者反编译它返回到具有相同功能的 Java 源代码1

1 Java 编译器通常会输出相当容易转换回具有相同功能的源代码的字节码(其他编译语言如 C/C++ 并非如此)。可以使用诸如 Proguard 之类的工具来混淆代码,该工具将标识符替换为无意义的标识符,并且还可以在执行时将某些操作转换为具有相同结果的高度不清楚的操作。

于 2013-06-26T23:12:15.590 回答
2

编译后的代码只是意味着 IDE 没有可用的源代码(但代码是用 Java 编写的)。这些sun.*类通常不提供其源代码,因为它们具有非公共 API。这不应与native代码混淆,代码可以用 C/C++ 编写并通过 JNI/JNA 调用。

于 2013-06-26T23:10:18.593 回答