标签: java-bytecode-asm

在Android上使用Groovy

随着ASMDEX(dex文件的ASM)和dexmaker的出现,不应该将Groovy移植到Android吗?两个框架都允许在运行时生成dex字节码.

据我了解,不可能在内存中修改APK中的dex类.但是不可能将这些类复制到可写内存,在运行时修改这些副本并使用它们吗?

还需要移植什么来处理dex类文件?CGLIB

groovy android cglib dex java-bytecode-asm

13
推荐指数
1
解决办法
4120
查看次数

Java:在同一个JVM中从运行时获取类的字节码

相关: 有没有办法在运行时获取类的字节码?

我正在为Clojure增加耐久性,我终于到了准备添加功能的地步.在Clojure中,函数通过调用方法(以及其他方式)进行字节编译.这样,功能就是一流的.为了使这些持久,我需要序列化和反序列化这些类.如何在不访问.class文件的情况下获取类的字节码?

如果我弄错了,请纠正我,但使用代理需要生成一个单独的VM,代理连接到第一个VM.我需要从同一个VM做到这一点.

使用Serializable来设置和获取Class对象是不够的.在反序列化时,我需要加载该类,并且在后续VM实例上,可能存在类名冲突.我需要修改字节码,以便在反序列化/类加载时将类重命名为唯一的.

java persistence bytecode clojure java-bytecode-asm

12
推荐指数
1
解决办法
6088
查看次数

将代码添加到带有Instrumentation的Java类:ASM还是BCEL?

我正在编写一个游戏引擎/库,其中我有一个事件调度程序类,它通过调用"已注册"事件处理程序类的侦听器方法来调度事件.可以通过调用适当的调度程序方法向事件调度程序注册事件处理程序/侦听器.

这显然会导致一些样板代码用于注册每个事件处理程序(以及我的引擎的其他方面都有类似的bolierplate代码),所以我想知道 - 如何在加载事件处理程序期间使用Instrumentation添加所有必需的代码class,因此编码时不需要事件调度程序的显式注册 - 在程序运行时自动添加对调度程序寄存器方法的调用.

我的理解是,为了使用Instrumentation,应该使用一些字节码修饰符API.我知道两个 - ASM和BCEL.我应该使用哪一个?显然,这是我想要做的一个简单的任务,所以我想要一个更容易学习和更好记录的那个.

编辑:这是一个具体的例子.

原始事件处理程序类:

@Handler //indicates this this class should be transformed
public class MouseEventHandler implements EventHandler<MouseEvent>
{
    //hidden default constructor
    public void handleEvent(MouseEvent event)
    { ... }
}
Run Code Online (Sandbox Code Playgroud)

改造后:

@Handler
public class MouseEventHandler implements EventHandler<MouseEvent>
{
    public MouseEventHandler()
    {
        //add this line of code to default constructor
        Game.getEventDispatcher().addEventHandler(this);
    }
    public void handleEvent(MouseEvent event)
    { ... }
}
Run Code Online (Sandbox Code Playgroud)

java instrumentation bytecode bcel java-bytecode-asm

12
推荐指数
2
解决办法
7009
查看次数

Java中的字节码分析

我正在开发一个字节码分析项目,我正在使用ASM.一切都很顺利,我能够成功解析,获得类和方法信息.

但我坚持理解泛型的字节码表示.下面是一个例子java.util.list,当我使用visitMethodClassVisitor打印的信息,这是我得到的方法的签名之一:

(ILjava/util/Collection<+TE;>;)Z
Run Code Online (Sandbox Code Playgroud)

在这里,我试图逐个反汇编并理解方法的参数:

  • I 代表int
  • Ljava/util/Collection 代表它是一种类型的论证 Collection

但我被困在仿制药类型<+TE>等等.任何人都可以指导我吗?我试图搜索但没有得到足够的信息.如果有人有字节码名称列表,请分享一下吗?

java bytecode bytecode-manipulation java-bytecode-asm

12
推荐指数
1
解决办法
2495
查看次数

注入Java方法_before_调用另一个方法

我正在使用ASM并希望重写类似的东西:

someMethod().targetMethod(args...)
Run Code Online (Sandbox Code Playgroud)

至:

someMethod().injectedMethod(arg).targetMethod(args...)
Run Code Online (Sandbox Code Playgroud)

问题是我不知道之前的方法是什么,我只知道目标方法(因此找不到someMethod()并注入之后不是一个选项).

我还有许多版本的目标方法,我想要使用不同的参数集.

使用ASM我可以很容易地找到目标方法调用,但不幸的是,那时的操作数堆栈是:

[ argN, ..., arg1, instance, ... ]
Run Code Online (Sandbox Code Playgroud)

虽然我可以计算出实例的距离,但是我没有可以注入的字节码会读取它.我知道你可以使用带有dup命令的技巧最多4个参数,但我需要一个通用的解决方案.

我可以添加一堆局部变量并将所有内容复制到堆栈中,复制指向的实例并重新打开所有内容,但这是我真正不想要的运行时效率低下.

我认为可行的是,如果我可以跟踪哪个指令负责将实例指针放在堆栈上,然后我可以在那里注入我的方法调用而不是在目标方法调用.但是,我没有找到任何帮助我做这件事的运气.

我知道像AspectJ这样的东西允许这样做,但是必须在很多类中执行此操作,因为它们加载并且AspectJ太慢了.

任何人都可以指出我在ASM之上构建的分析工具可能让我这样做,或者任何人都可以想到一个更好的方法来在另一个之前注入一个方法调用?

java bytecode-manipulation java-bytecode-asm

11
推荐指数
1
解决办法
1485
查看次数

生成'Hello,World!' 使用Java ASM库的类

我已经开始乱用我正在研究的编译器项目的ASM API.但是,我发现文档对很多地方的新手来说并不清楚,我认为有一个很好的例子,可以生成一个只打印"Hello,World!"的类.这将是一个很好的例子.

目前,我可以使用main()(使用ClassWriter,ClassVisitor和MethodVisitor类)生成一个类,但我似乎无法弄清楚如何生成main的主体.任何人都可以给我一个在ASM中生成类文件的示例:

  • 包含一个main()
  • 在main()中创建一个本地String变量,其值为"Hello,World!"
  • 打印变量

java bytecode compilation jvm-languages java-bytecode-asm

10
推荐指数
2
解决办法
1万
查看次数

Android中的自定义编程语言(jar)

这是我的情况,我有一个自定义编程语言,可以编译成Java字节代码.我有jar,我希望在Android应用程序中使用一些类.我需要一些关于如何处理这个问题的建议.我可以从jar中导入其中的一些类,但我不知道如何在Android上编译/运行它.任何建议表示赞赏谢谢

java eclipse android dalvik java-bytecode-asm

10
推荐指数
1
解决办法
198
查看次数

JVM语言的互操作性

最近我一直在为JVM编程语言编写一个编译器,我意识到了一个问题.

我想从我的编程语言中访问Java方法,并允许Java方法以我的语言访问方法.问题是我需要知道Java方法签名,以便在我生成的字节码中调用它,反之亦然.

我一直在试图考虑Scala如何做到这一点的任何方法.这是我的想法.

  1. Scala访问.java类路径上的文件并解析它们,从那里提取方法签名.
  2. .java文件被编译为.class文件.然后使用Java ASM库来访问.class文件并获取方法签名.此方法的问题是.java必须首先编译文件.
  3. .java使用反射动态加载文件.这个问题是我认为JVM不允许加载编译器类路径之外的类.

查看Scala,它可以很好地与其他JVM语言配合使用,但我无法找到有关它如何实现的信息.

Scala如何获取其他JVM语言方法的方法签名?

java compiler-construction programming-languages scala java-bytecode-asm

10
推荐指数
1
解决办法
262
查看次数

ASM中的Java方法参数值

我试图获取Java程序的方法参数的值.我正在使用ASM来检测字节码并获取这些值.但是,我遇到了一些麻烦.

这是用于检测代码的visitCode()方法.它正在做的是:

  1. 创建一个空数组以存储收集的参数.
  2. 对于每个参数,将其值加载到数组中.
  3. 将此数组发送到我的代理的OnMethodEntry方法(将使用其值).

.

@Override
public void visitCode() {
    int paramLength = paramTypes.length;

    // Create array with length equal to number of parameters
    mv.visitIntInsn(Opcodes.BIPUSH, paramLength);
    mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
    mv.visitVarInsn(Opcodes.ASTORE, paramLength);

    // Fill the created array with method parameters
    int i = 0;
    for (Type tp : paramTypes) {
        mv.visitVarInsn(Opcodes.ALOAD, paramLength);
        mv.visitIntInsn(Opcodes.BIPUSH, i);

        if (tp.equals(Type.BOOLEAN_TYPE) || tp.equals(Type.BYTE_TYPE) || tp.equals(Type.CHAR_TYPE) || tp.equals(Type.SHORT_TYPE) || tp.equals(Type.INT_TYPE))
            mv.visitVarInsn(Opcodes.ILOAD, i);
        else if (tp.equals(Type.LONG_TYPE)) {
            mv.visitVarInsn(Opcodes.LLOAD, i);
            i++;
        }
        else if (tp.equals(Type.FLOAT_TYPE))
            mv.visitVarInsn(Opcodes.FLOAD, i);
        else if …
Run Code Online (Sandbox Code Playgroud)

java jvm bytecode bytecode-manipulation java-bytecode-asm

9
推荐指数
1
解决办法
5040
查看次数

如何在每次返回之前将消息添加到消息中?

我目前正在尝试通过精心设计的java-asm库(版本4)生成代码.更具体地说,我想在每次返回调用之前将代码附加到方法的末尾.我成功地能够在方法代码之前添加代码.但是目前我不知道如何进行上述转换.我真的很感激指出如何实现这一目标.

MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 42);
return mv;
Run Code Online (Sandbox Code Playgroud)

java java-bytecode-asm

9
推荐指数
2
解决办法
2411
查看次数