NOP在今天的JVM 中,Java虚拟机的操作码是否有任何实际用途?如果是这样,NOP在字节码中生成s的情况是什么?
我甚至有兴趣看到一个用NOPs 编译成字节码的Java代码示例.
更新
BCEL的MethodGen类说,
在生成代码时,可能需要插入NOP操作.
我猜测其他字节代码库正在同一条船上,正如在接受的答案中所指出的那样.
可能重复:
在单独的文件夹中编译python文件的方法?
当python将模块编译为字节码时,它会从.py文件生成.pyc文件.
我的问题是,是否可以将这些.pyc文件写入与模块所在位置不同的目录?
例如,我有一个大型模块目录.我希望将源代码保存在目录中,并且有一个像"bytecode"这样的子目录,其中存储了所有.pyc,而不是让它充满.pyc文件.
这可能吗?
与反编译本机x86二进制文件相比,为什么将.NET IL-code反编译为源代码如此容易?(Reflector在大多数情况下都会生成相当好的源代码,而反编译C++编译器的输出几乎是不可能的.)
是因为IL包含大量元数据吗?或者是因为IL是比x86指令更高的抽象?我做了一些研究,发现了以下两篇有用的文章,但它们都没有回答我的问题.
什么是好的免费字节码编辑器?我想要一个编辑器,一个带有GUI的东西......
我试过没有运气的jbe-0.1b(无法保存字节码的变化).
在Java中,是否有一种方法(在运行时)获取定义特定类的字节码?
换句话说,有没有办法获取在加载特定类时byte[]传递给的数组ClassLoader.defineClass(String name, byte[] b, int off, int len)?我看到声明了这个方法final,因此创建一个ClassLoader拦截类定义的自定义似乎是不可能的.
在过去,我已经使用类ClassLoader来通过该getResourceAsStream(String)方法获取字节码,但我更喜欢更规范的解决方案.
我们知道我们不必向Java构造函数添加任何返回类型.
class Sample{
.....
Sample(){
........
}
}
Run Code Online (Sandbox Code Playgroud)
在Objective C中,如果我们创建一个构造函数,它会返回一个指向其类的指针.但我认为这不是强制性的.
AClass *anObject = [[AClass alloc] init];//init is the constructor with return type a pointer to AClass
Run Code Online (Sandbox Code Playgroud)
类似地,构造函数是否转换为返回对其自己的类的引用的方法?
像这样:
class Sample{
.....
Sample Sample(){
........
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器是否向构造函数添加了对同一类的引用的返回类型?构造函数发生了什么?有没有参考研究这个?
实际上我希望答案是字节代码级别或JVM级别甚至更低.
我正在使用Java进行字节码操作/生成,我只是想知道是否有一种简单的方法可以检查字节码.我不想反编译文件,我想实际查看编译后的字节码.我不需要编辑它.任何用于执行此操作的链接或程序都是可接受的答案.
我正在寻找以下想法的现有实现:假设有人想在普通Java程序中编写"内联汇编"字节代码(大多数相关应用程序将涉及Java中无法提供的invokedynamic指令).一种方法是:
void foo(boolean b) {
Label l1 = Asm.label();
Label l2 = Asm.label();
int i = Asm.no_int();
Asm._const(0);
Asm.store(i);
l1.bind();
Asm.load(i);
Asm.push(10);
Asm.if_cmpge(l2);
Asm.getstatic("java/lang/System", "out", "Ljava/io/PrintStream");
Asm.load(i);
Asm.invokevirtual("java/io/PrintStream", "println", "(I)V");
Asm.inc(i);
Asm._goto(l1);
l2.bind();
Asm._return();
}
Run Code Online (Sandbox Code Playgroud)
指令被编码为API调用,然后我们需要运行普通的java编译器,然后对字节代码进行后处理并用实际指令替换API调用.
PS我知道ASM框架的ASMifier,它没有解决上述问题.
Java字节码语言具有JSR指令.
我用Java 7编译器编译的代码都没有使用此指令.
但是,有时我下载的Java二进制文件确实使用它,尽管很少.
我有兴趣知道编译器使用什么指令,以及Java代码构造会导致它们使用它.
编辑它不是重复的,因为它引用了JSR字节码指令而不是Java规范请求
重现步骤
顺便提一句,
显示 Kotlin 字节码
工作正常但坏了
显示字节码
(我猜它会显示 java 或 java 字节码)
一开始我重新启动ide并发生同样的错误