Tag: 字节码

将变量推送到堆栈中的Stack和Variables差异?

所以我知道存在2个内存区域: Stack和Heap 。 我也知道,如果你创建一个局部变量,它将存在于堆栈中,而不是堆中。 随着我们将数据推入其中,堆栈将会增长,如: 现在我将尝试通过我对你的困惑: 例如,这个简单的Java代码: public class TestClass { public static void main(String[] args) { Object foo = null; Object bar = null; } } 被翻译成这个字节码: public static void main(java.lang.String[]); Code: Stack=1, Locals=3, Args_size=1 0: aconst_null 1: astore_1 2: aconst_null 3: astore_2 4: return LineNumberTable: line 5: 0 line 6: 2 line 7: […]

Java ASM字节码修改 – 更改方法体

我在jar子里有一个类的方法,我想用自己的身体交换它。 在这种情况下,我只想让方法打印出“GOT IT”到控制台并返回true; 我正在使用系统加载程序来加载jar的类。 我使用reflection使系统类加载器能够通过字节码加载类。 这部分似乎工作正常。 我按照这里找到的方法替换示例:asm.ow2.org/current/asm-transformations.pdf。 我的代码如下: public class Main { public static void main(String[] args) { URL[] url = new URL[1]; try { url[0] = new URL(“file:////C://Users//emist//workspace//tmloader//bin//runtime//tmgames.jar”); verifyValidPath(url[0]); } catch (Exception ex) { System.out.println(“URL error”); } Loader l = new Loader(); l.loadobjection(url); } public static void verifyValidPath(URL url) throws FileNotFoundException { File filePath […]

字节码指令与处理器操作之间的关系

Java规范保证原始变量赋值始终是primefaces的(期望long和双types 。 相反,对应于着名的i++增量操作的Fetch-and-Add操作将是非primefaces的,因为导致读 – 修改 – 写操作。 假设这段代码: public void assign(int b) { int a = b; } 生成的字节码是: public void assign(int); Code: 0: iload_1 1: istore_2 2: return 因此,我们看到赋值由两个步骤组成(加载和存储)。 假设这段代码: public void assign(int b) { int i = b++; } 字节码: public void assign(int); Code: 0: iload_1 1: iinc 1, 1 //extra step here […]

什么样的Java代码需要stackmap框架?

我正在尝试编写unit testing以解决有关缺少stackmap帧的问题的解决方法,但为此目的,我将需要生成一个在Java 8上无法validation的类,如果它缺少stackmap帧。 下面你可以看到我的测试用例(依赖项:ASM,Guava,JUnit)。 它从GuineaPig类中删除了stackmap帧,希望导致其字节码无法validation。 我遇到问题的部分是使用最少的代码来填充GuineaPig中的TODO,这需要堆栈图帧,以便测试通过。 import com.google.common.io.*; import org.junit.*; import org.junit.rules.ExpectedException; import org.objectweb.asm.*; import java.io.*; import static org.objectweb.asm.Opcodes.ASM5; public class Java6MissingStackMapFrameFixerTest { @Rule public final ExpectedException thrown = ExpectedException.none(); public static class GuineaPig { public GuineaPig() { // TODO: make me require stackmap frames } } @Test public void example_class_cannot_be_loaded_because_of_missing_stackmap_frame() throws Exception { byte[] […]

“()V”在class级签名中的含义是什么?

我用Javassist创建了一个没有实际方法的构造函数 CtConstructor c = CtNewConstructor.make ( argTypes, null, newClass ); 当我试图推出这个类的签名时 c.getSignature(); 我明白了 public Echo ()V 我很困惑“V”是什么意思? 我期待公共Echo(); 或类似的东西……

你能在运行时检查Java 8 lambda的字节码吗?

如果你有像这样的匿名类 Predicate isEmpty = new Predicate() { public boolean test(String t) { return t.isEmpty(); } }; 传递给isEmpty的引用的库可以检查字节代码以查看它的作用并可能对其进行操作。 有没有办法可以为lambdas做到这一点? Predicate isEmpty = String::isEmpty; 例如,假设有这个代码和字节码 public class Main { public static void test(Predicate tester) { System.out.println(“tester.getClass()= ” + tester.getClass()); System.out.println(“tester.getClass().getClassLoader()=”+ tester.getClass().getClassLoader()); } public static void main(String… args) { Predicate isEmpty = String::isEmpty; test(isEmpty); } } $ javap […]

Javassist进行。 什么是主要想法和实际使用的地方?

我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法。 好的,但为什么我们需要操纵字节码? 任何真实的例子? 任何真正的应用程序,javassist使用?

Java – 二进制代码与ByteCode相同吗?

在Java中,“二进制代码”是否与“Java字节码”相同? 这是Java中的流程吗? Java文件(.java) – > [javac] – > ByteCode文件(.class) – > [JVM / Java解释器] – >运行它(首先将其转换为特定于机器的二进制代码) 谢谢!

了解Java字节代码

我经常遇到没有源代码的java类文件,我试图理解我手边的问题。 注意反编译器很有用,但在所有情况下都不够…… 我有两个问题 有哪些工具可用于查看java字节代码(最好从linux命令行获得) 熟悉java字节码语法有什么好的参考

口译员如何解释代码?

为简单起见,想象一下这个场景,我们有一台2位计算机,它有一对2位寄存器,称为r1和r2,只适用于立即寻址。 让我们说比特序列00意味着添加到我们的CPU。 01表示将数据移至r1,10表示将数据移至r2。 因此,这台计算机和汇编程序有一个汇编语言,其中的示例代码将被编写为 mov r1,1 mov r2,2 add r1,r2 简单地说,当我将此代码汇编为本机语言时,文件将类似于: 0101 1010 0001 上面的12位是本机代码: Put decimal 1 to R1, Put decimal 2 to R2, Add the data and store in R1. 所以这基本上是编译代码的工作原理,对吧? 让我们说有人为这个架构实现了一个JVM。 在Java中,我将编写如下代码: int x = 1 + 2; JVM将如何解释此代码? 我的意思是最终必须将相同的位模式传递给cpu,不是吗? 所有cpu都有许多可以理解和执行的指令,它们毕竟只是一些位。 让我们说编译的Java字节码看起来像这样: 1111 1100 1001 或者其他..是否意味着解释在执行时将此代码更改为0101 1010 0001? 如果是,它已经在本机代码中了,那么为什么说JIT只是经过多次启动? 如果它没有完全转换为0101 1010 0001,那么它会做什么? […]