Tag: 字节码

如何在Scala编译器重写原始Scala代码的代码中看到

在Scala邮件列表之后,不同的人经常说:“编译器将此[scala]代码重写为此[java / scala ??]代码”。 例如,如果Scala看到,可以从最新的一个主题中找到 class C(i: Int = 4) { … } 然后编译器将其重写为(有效): class C(i: Int) { … } object C { def init$default$1: Int = 4 } 我怎样才能知道代码的编译器输出是什么? 我应该反编译生成的字节码吗?

哪个库/程序可用于生成Java字节码?

我知道BCEL ,但这个项目似乎已经死了,因为它已经两年没有发布了。 Java世界继续前进。 例如,JDK 1.6具有新的类文件格式。 那么可以使用什么库来为JVM创建字节码。 如果没有库,程序也可以,如果我可以详细操作生成的代码,例如字节码 – 汇编程序。 你能推荐哪种软件? 是否容易使用? 有很好的例子/教程? 编辑:所有问:是的,javac很好。 但是为了在运行时生成一些类,直接到字节码的路径会更清晰。

识别java字节代码中的循环

我正在尝试检测java字节码。 我想要识别java循环的进入和退出 ,但我发现循环的识别非常具有挑战性。 我花了几个小时看ASM和开源反编译器 (我认为他们必须一直解决这个问题)但是,我做得很短。 我正在扩充/扩展的工具是使用ASM,所以理想情况下我想知道如何通过ASM检测java中不同循环结构的进入和退出 。 但是,我也欢迎建议一个好的开源解编译器,因为很明显他们会解决同样的问题。

为什么字节码在直接字段访问时调用Object-> getClass()

我反编译Java(实际上是Dalvik)字节码。 在方法的开头,我直接访问实例成员的字段(即不通过getter)。 看来Java在被访问的实例成员( Object.getClass()上调用了Object.getClass() ),但是没有在任何地方使用结果。 这是某种检查吗? 为什么需要这个电话? 我怀疑这是因为我直接访问一个字段(在该类中定义),但我没有看到连接。 Java代码和反编译的字节码如下。 (注意,最后一条指令将lifeTime加载为常量0x0001因为在MyOtherClass ,我将lifeTime作为public final字段,并且当前从代码初始化。) MyOtherClass other = mOther; if (mAge >= other.lifeTime) { // lifeTime is initialized to 0x0001 end(); return; } .line 53 move-object/from16 v0, p0 iget-object v0, v0, Lcom/example/engine/MyClass1;->mOther:Lcom/example/engine/MyOtherClass; move-object/from16 v16, v0 .line 54 .local v16, other:Lcom/example/engine/MyOtherClass; move-object/from16 v0, p0 iget v0, v0, Lcom/example/engine/MyClass1;->mAge:I move/from16 […]

Arrays如何在Java的ByteCode中工作

如果我使用像List,Vector或其他类似的普通类,我得到一个size()函数,它返回所考虑的类的长度,但如果我使用类的数组或默认数据类型,我得到一个公共成员长度,返回数组的当前长度。 int a[] = new int[3]; a.length; // used without () Vector v = new Vector(); v.length(); // used with () 这是为什么? 我的意思是一个数组不是自己的类不是吗? 因此,如果它不是类,它就不能拥有成员变量。 我无法知道如何在后台处理(ByteCode)。 我知道内存中的数组存储有一个指向数组第一个元素的指针,并且索引(i)内存指针被转移到ArrayPointer + i*(size of DataType) 。 现在你可以说计算机遍历数组的所有元素并计算所有元素,但计算机如何知道数组的结束位置和下一个数组的起始位置? 从哪里来的“成员可变”来自存储大小的arrays? 我的意思是我们经常使用数组,但我知道在ByteCode中Java代码背后会发生什么。 你能告诉我这是怎么可能的吗?

如何使用Byte Buddy创建默认构造函数

我想拦截我的一个类上的一些方法调用,但这些类没有默认的构造函数。 鉴于以下类,我如何设置Byte Buddy也创建一个公共无参数构造函数来创建生成的类? public class GetLoggedInUsersSaga extends AbstractSpaceSingleEventSaga { private final UserSessionRepository userSessionRepository; @Inject public GetLoggedInUsersSaga(final UserSessionRepository userSessionRepository) { this.userSessionRepository = userSessionRepository; } @StartsSaga public void handle(final GetLoggedInUsersRequest request) { // this is the method in want to intercept } } 编辑:具体的用例是简化unit testing设置。 目前我们总是要写这样的东西: @Test public void someTest() { // Given // When GetLoggedInUsersRequest request […]

在ASM字节码中打印方法很漂亮

我正在尝试(没有成功) 仅打印给定方法的内容。 以下代码几乎可以解决问题: class MyTraceMethodVisitor extends MethodVisitor { public MyTraceMethodVisitor(MethodVisitor mv) { super(Opcodes.ASM4, mv); } @Override public void visitMaxs(int maxStack, int maxLocals) { } } class MyClassVisitor extends ClassVisitor { public MyClassVisitor(ClassVisitor cv) { super(Opcodes.ASM4, cv); } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { return null; } @Override […]

拥有没有任何构造函数的JVM字节码类是否有效?

AFAIK,Java中的隐式构造函数总是为没有构造函数的类生成[1] , [2] 。 但在字节码中,我无法在JVMS上找到这样的限制。 所以: 根据JVMS来定义一个没有构造函数的类只有在下面的jasmin hello世界中使用它的静态方法是有效的吗? 除了无法创建它的实例之外还有其他任何后果吗? 根据https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.4 ,我将无法使用invokespecial来初始化实例,这会使new无用。 (不能使用未初始化的对象)。 Jasmin代码: .class public Main .super java/lang/Object .method public static main([Ljava/lang/String;)V .limit stack 2 getstatic java/lang/System/out Ljava/io/PrintStream; ldc “Hello World!” invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V return .end method 也就是说, 没有构造函数: .method public ()V aload_0 invokenonvirtual java/lang/Object/()V return .end method ? 使用java Main运行会给出预期的输出Hello World! 。 我检查了javap -v输出,与Java不同, jasmin没有生成默认构造函数。 […]

什么是Java字节码注入?

究竟什么是Java字节码注入以及为什么要使用它?

为什么编译的Java类文件小于C编译文件?

我想知道为什么我们通过编译打印“Hello,World!”的.c文件获得的.o文件。 大于Java .class文件,也打印“Hello,World!”?