gpt4 book ai didi

java - 有些方法包含编译代码?

转载 作者:行者123 更新时间:2023-12-01 06:16:49 31 4
gpt4 key购买 nike

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

public void someMethod(){
编译代码
}

展开方法可以看到里面的代码都写成注释了。

查看 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>
}

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

最佳答案

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

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

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

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

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

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

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

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

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

关于java - 有些方法包含编译代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331934/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com