当前位置: 首页 > 面试题库 >

哪些Java编译器使用jsr指令,做什么用?

吉俊德
2023-03-14
问题内容

Java字节码语言具有JSR指令。

我使用Java 7编译器编译的代码均未使用此指令。

但是,有时我下载的Java二进制文件确实会使用它,尽管很少。

我很想知道哪些编译器确实使用该指令,以及哪些Java代码构造会使它们使用该指令。

编辑 这不是重复的,因为它引用了JSR字节码指令,而不是Java规范请求


问题答案:

实际上,Java 7类文件中甚至不允许使用JSR指令。仅在与Java
5或更早版本相对应的49.0或更早版本的类文件中才允许使用。实际上,它在那之前很久就不使用了。

JSR / RET机制最初用于实现finally块。但是,他们认为节省代码大小并不值得额外的复杂性,因此逐渐被淘汰了。

我不知道确切的版本,因为我找不到任何旧的编译器,但是根据我在网上找到的讨论,似乎这种转变发生在Java
1.2-1.3时代,不同的编译器在不同的时间切换。我从未见过这些旧编译器之一提供的合法类文件,但您永远不知道何时会发生。

实际上,我在野外看到的JSR唯一用途是用于混淆。例如,Zelix
Klassmaster曾经将其用于其字符串解密代码。我还在自己的几个Java破解程序中使用了它。



 类似资料:
  • UE4 的底层虽然是用 C++ 实现的,但它又不仅仅是一个 C++ 库,它还实现了自己的编译机制。换句话说,UE4 对现有的 C++ 语法进行了改进,以适应游戏开发的场景。 当然,UE4 也不会疯狂到自己去开发一个 C++ 编译器,它还是需要依赖传统的 C++ 编译器以及相关的编程套件。 熟悉 Qt 的读者应该知道,Qt 虽然也使用 C++,但是它还提供了信号和槽的机制,这是原生 C++ 里面没有

  • 为了在运行windows 7 pro的intel core 2上完成一些cmov指令,我编写了以下代码。它所做的就是从控制台获取一个字符串作为输入,应用一些移位操作来生成一个随机种子,然后将该种子传递给srand,以生成一个小的伪随机数数组。然后评估伪随机数是否满足谓词函数(更任意的位随机),并输出“*”或“\u1”。实验的目的是生成cmov指令,但正如您在下面的反汇编中所看到的,没有。 有没有关

  • 问题内容: 我是第一次运行TensorFlow并使用一些示例代码。运行代码时出现此错误。有谁知道为什么会这样,如何解决?谢谢! 问题答案: 这些是警告,而不是错误(如冒号后面的所示。错误在那里)。 警告是指您的CPU支持SSE指令,从而可以进行一些快速的硬件内并行操作。启用这些操作是一个编译时操作(即,要使用SSE,您需要从源代码构建库以启用要定位的特定SSE版本),在这种情况下,您可以考虑一下此

  • 主要内容:什么是编译器,什么是集成开发环境,选择哪种集成开发环境我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为 可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有 .exe 和 .com(其中 .exe 比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断是否是可执行程序。 可执行程序的内部是一系列计算机指令和数据的集合,它们

  • 问题内容: IntelliJ IDEA 2016.3添加了将构建/运行委托给Gradle的功能。 很明显,当委托选项启用时,Gradle会执行所有操作。 我的问题是,关闭此选项时,IntelliJ到底在做什么? 我问这个问题是因为我的Gradle文件中有自定义代码,并且在IntelliJ中构建时似乎未执行此代码。当我运行时,一切正常。 问题答案: IntelliJ有自己的构建系统,称为JPS,它使

  • 变量res的值应等于3。但是当我打开优化时,编译器错误地重新排列了指令,并且res包含一些垃圾。一些可能的重新排序示例: 这是编译器中的错误吗?还是不允许像这样访问结构数据成员? 编辑: 我刚刚意识到之前的代码实际上有效,抱歉。但这不起作用: 当编译时不知道变量i时,编译器会错误地重新排序指令。