这段代码如何使用保留关键字作为字段名称?

2024-03-25

我在遗产中发现了以下结构java字节码在尝试解决服务器应用程序启动问题时。 我的 IDE 反编译了一些第三方库,我很好奇这如何有效 - 以前从未见过keywords可以用作字段名称在字节码中。

字节码版本为 48.0 (Java 1.4)。

public final class f implements UserContext{

private final String try;
private final UserInfo do;

// a lot of code here 

public UserInfo getUserInfo(){
    return this.do;
}

public String getViewName(){
    return this.try;
}

}

似乎该库是使用一些混淆功能编译的, 但它怎么可能是 JVM 级别的呢?没有特殊情况可以允许吗 JVM 启动时的标志?

UPDATE:正确的吸气剂名称UserInfo场是getUserInfo-- 很抱歉让每个人对具有不同返回值的方法的模糊命名感到困惑,这是一个复制粘贴问题,因为代码位于远程计算机上,无法直接访问该站点。


Java 虚拟机规范(负责定义字节码的外观)提出事物名称上没有与关键字相关的限制 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.2.

这些限制仅存在在爪哇Language level https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.9。您使用的字节码不会反编译为有效的 Java,因为它使用的名称在 Java 语言中无效,但是are对 JVM 有效。

类似的逻辑也适用于两者getViewName仅返回类型不同的方法:JVM 规范在字节码中允许这样做(并且工作得很好),但 Java 语言规范禁止这样做。

像这样的字节码最常见的原因是 Java 代码被编译为字节码,然后混淆的 https://en.wikipedia.org/wiki/Obfuscation_(software).

另一个可能的原因是,该代码最初并不是由Java代码编译产生的,而是另一种针对JVM的语言。在这种情况下这是不太可能的,因为没有人会命名变量do当它应该保存视图名称时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这段代码如何使用保留关键字作为字段名称? 的相关文章

随机推荐