标签: bytecode

ASM:有状态转型

我想编写一个MethodVisitor来转换用于乘法的LDC指令.

字节码示例:

ldc #26
imul
Run Code Online (Sandbox Code Playgroud)

这基本上推动了一个常数然后乘以它.

它必须是有状态的转换,因为我首先必须检查它是否为乘法,如果是,我需要返回到ldc指令并修改常量.我不完全确定我会怎么做,我不知道如何修改常量(当我尝试传递一个不同的值时,旧的值仍然保留在常量池中).

编辑:

public class AdditionTransformer extends MethodAdapter {
    boolean replace = false;
    int operand = 0;

    AdditionTransformer(MethodVisitor mv) {
        super(mv);
    }

    @Override
    public void visitInsn(int opcode) {
        if (opcode == IMUL && replace) {
            operand *= 2;
            visitLdcInsn(operand);
            replace = false;
        }
        mv.visitInsn(opcode);
    }

    @Override
    public void visitLdcInsn(Object cst) {
        if (cst instanceof Integer && !replace) {
            operand = (Integer) cst;
            replace = true;
        } else {
            mv.visitLdcInsn(cst);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的,但它不会删除常量池中的旧值,并且可能存在错误.

java bytecode java-bytecode-asm

7
推荐指数
1
解决办法
841
查看次数

dalvik上的字节码注入

我在android平台上问了这个,但是没有收到回复.我已经提到了这个帖子,但找不到他所指的帖子(动态生成Dalvik字节码到运行的Dalvik/Android应用程序)

此外,还提出了此问题(http://code.google.com/p/android/issues/detail?id=6322)

所以,我的问题是,

  1. 这方面有什么进展吗?
  2. 是否可以将新的字节码注入正在加载的类中?
  3. 如果是这样,任何指针都相同?

干杯.Earlence

android bytecode code-injection dalvik

7
推荐指数
1
解决办法
2206
查看次数

如何检查类文件版本50.0(Java 6)是否已经过预验证?

我使用ProGuard将一些jar文件从类文件版本49.0"升级"到50.0.

因为预验证对于版本50.0是可选的,我想知道是否有办法检查类文件中是否真的有StackMapTable属性.

(并不是我不相信ProGuard"[...]以下选项通过更新内部版本号并预先验证它们来将类文件升级到Java 6."但我想学习如何验证它的存在性StackMapTable.)

java verification scala bytecode class

7
推荐指数
1
解决办法
820
查看次数

是否有可能使用javassist java核心类?bootstrap类加载器加载的类

我想在核心JDK 5类的方法上添加"insertBefore".由于某种原因它不起作用.这是代码的示例:

ClassPool pool = ClassPool.getDefault();
CtClass ctClass =  pool.get("com.sun.org.apache.xerces.internal.impl.xs.XSMessageFormatter");
CtMethod ctMethod = ctClass.getDeclaredMethods()[0];
ctMethod.insertBefore("System.out.println(\"WORKED\");");
ctClass.toClass();
Run Code Online (Sandbox Code Playgroud)

com.sun.org.apache.xerces.internal.impl.xs.XSMessageFormatter与JDK捆绑在一起,它位于rt.jar中.在上面的代码片段之后,我运行了一些强制XSMessageFormatter类运行的代码,但我插入的代码永远不会运行.我只能在自己的班级上工作.此代码作为一个简单的独立应用程序运行.

有任何想法吗?

java instrumentation bytecode javassist

7
推荐指数
1
解决办法
622
查看次数

如果字节码是在1.4中编译的,我们仍然可以获得Java 6的性能提升

我假设在浏览本文档后,Java 1.4和Java 6之间存在巨大的性能差异.

我的问题,当Java必须运行的字节码在1.4中编译时,Java 6运行时是否仍然有它的魔力?

一些背景为"为什么这个问题?" 就是在这里.

java bytecode jvm-hotspot

7
推荐指数
1
解决办法
193
查看次数

如果父类/接口发生变化,类的字节码是否会发生变化?

我正在尝试确定是否需要在构建链中重新编译一些jar,如果我有以下结构,jar 1在其源更改时编译,jar 2在其源更改或jar 1重新编译时编译.

罐子1:

public class Foo /* impl*/
Run Code Online (Sandbox Code Playgroud)

罐子2:

public class Bar extends Foo /*impl*/
Run Code Online (Sandbox Code Playgroud)

假设两个类之间的合同没有改变,即.添加抽象方法或将方法添加到接口等.

我需要重新编译jar 2吗?即.如果对Foo中的私有方法进行了一些更改,Bar需要重新编译吗?

我尝试通过比较两个类的字节码来测试这个,在一个中更改一堆并且正如预期的那样它没有改变.然而,我的同事坚持认为他们遇到过这样的情况:即使合同没有变更,他们也必须重新编译一切才能工作,但是他们不记得原因是什么......所以举证责任在我身上证明了这不应该是必要的.是否存在对超类进行更改将需要重新编译子类的情况,即使两者之间的接口保持不变?

java bytecode class

7
推荐指数
1
解决办法
930
查看次数

打包开关和稀疏开关dalvik操作码之间的区别

我想知道dalvik中打包交换机和稀疏交换机操作码之间的区别.如果你能提供例子,请.我不清楚谷歌提供的解释.

打包开关 稀疏开关

谢谢.

java android bytecode dalvik dex

7
推荐指数
1
解决办法
1608
查看次数

是否可以将Java字节码反编译回原始泛型类型参数

我知道Java编译器用泛型替换泛型类型中的所有类型参数,或者Object在类型擦除过程中类型参数是否无界限.生成的机器字节码将反映被替换的边界或Object.

有没有办法获取生成的机器字节码并将其反编译回包含泛型类型中的原始类型参数的Java文件?是否存在可以实现此目的的反编译器?或者由于编译过程的性质,这个过程是不可逆转的?

java generics bytecode decompiler

7
推荐指数
1
解决办法
1548
查看次数

为什么非执行编译时代码会增加 Raku 的字节码大小?它会降低运行时性能吗?

考虑以下两个程序:

unit module Comp;
say 'Hello, world!'
Run Code Online (Sandbox Code Playgroud)

和

unit module Comp;
CHECK { if $*DISTRO.is-win { say 'compiling on Windows' }}
say 'Hello, world!'
Run Code Online (Sandbox Code Playgroud)

天真地,我希望两个程序编译成完全相同的字节码:CHECK块指定在编译结束时运行的代码;检查一个变量然后什么都不做对程序的运行时行为没有影响,因此(我原以为)不需要包含在编译的字节码中。

然而,编译这两个方案并没有产生相同的字节码。具体来说,编译没有CHECK块的版本会创建 24K 的字节码,而带有它的版本则是 60K。为什么这两个版本的字节码不同?字节码中的这种差异是否具有(或可能具有)运行时成本?(似乎必须如此,但我想确定一下)。

还有一个相关的问题:DOC CHECK块如何与上述内容相适应?我的理解是,即使编译器DOC CHECK在不使用--doc标志运行时也会跳过块。与此一致,当给定一个像上面那样的块时,hello-world 程序的字节码不会增加大小DOC CHECK。但是,如果块包含语句,它的大小确实会增加use。由此,我得出结论,这use是某种特殊情况,即使在DOC CHECK块中也能执行。那是对的吗?如果是这样,还有其他类似的特殊形式我应该知道吗?

bytecode compilation rakudo raku

7
推荐指数
1
解决办法
128
查看次数

什么决定了 java 字节码 try catch 处理程序的堆栈图帧的局部变量?

假设我们用 try catch 块包围了一些字节码指令,并且本地类型在 try catch 块范围之间发生变化(以前用于 int 类型的本地寄存器现在用于引用类型,位于 TCB 内部)。

这个try catch块的handler只能有一个frame(不允许分割,java字节码规则)。但问题是,如果在本地类型更改之前抛出异常,则指针框架会有所不同。

根据在 TCB 中抛出异常时设置的本地类型,处理程序必须具有不同的帧,但这在 java 字节码中是不可能的。因此我的问题是:处理程序框架对应于 TCB 中的哪个部分?它会使用“超级类型”而不是选择一个(-> 未初始化)吗?

java bytecode javac

7
推荐指数
1
解决办法
67
查看次数