随着ASMDEX(dex文件的ASM)和dexmaker的出现,不应该将Groovy移植到Android吗?两个框架都允许在运行时生成dex字节码.
据我了解,不可能在内存中修改APK中的dex类.但是不可能将这些类复制到可写内存,在运行时修改这些副本并使用它们吗?
还需要移植什么来处理dex类文件?CGLIB?
我正在为Clojure增加耐久性,我终于到了准备添加功能的地步.在Clojure中,函数通过调用方法(以及其他方式)进行字节编译.这样,功能就是一流的.为了使这些持久,我需要序列化和反序列化这些类.如何在不访问.class文件的情况下获取类的字节码?
如果我弄错了,请纠正我,但使用代理需要生成一个单独的VM,代理连接到第一个VM.我需要从同一个VM做到这一点.
使用Serializable来设置和获取Class对象是不够的.在反序列化时,我需要加载该类,并且在后续VM实例上,可能存在类名冲突.我需要修改字节码,以便在反序列化/类加载时将类重命名为唯一的.
我正在编写一个游戏引擎/库,其中我有一个事件调度程序类,它通过调用"已注册"事件处理程序类的侦听器方法来调度事件.可以通过调用适当的调度程序方法向事件调度程序注册事件处理程序/侦听器.
这显然会导致一些样板代码用于注册每个事件处理程序(以及我的引擎的其他方面都有类似的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) 我正在开发一个字节码分析项目,我正在使用ASM.一切都很顺利,我能够成功解析,获得类和方法信息.
但我坚持理解泛型的字节码表示.下面是一个例子java.util.list,当我使用visitMethod从ClassVisitor打印的信息,这是我得到的方法的签名之一:
(ILjava/util/Collection<+TE;>;)Z
Run Code Online (Sandbox Code Playgroud)
在这里,我试图逐个反汇编并理解方法的参数:
I 代表intLjava/util/Collection 代表它是一种类型的论证 Collection但我被困在仿制药类型<+TE>等等.任何人都可以指导我吗?我试图搜索但没有得到足够的信息.如果有人有字节码名称列表,请分享一下吗?
我正在使用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之上构建的分析工具可能让我这样做,或者任何人都可以想到一个更好的方法来在另一个之前注入一个方法调用?
我已经开始乱用我正在研究的编译器项目的ASM API.但是,我发现文档对很多地方的新手来说并不清楚,我认为有一个很好的例子,可以生成一个只打印"Hello,World!"的类.这将是一个很好的例子.
目前,我可以使用main()(使用ClassWriter,ClassVisitor和MethodVisitor类)生成一个类,但我似乎无法弄清楚如何生成main的主体.任何人都可以给我一个在ASM中生成类文件的示例:
这是我的情况,我有一个自定义编程语言,可以编译成Java字节代码.我有jar,我希望在Android应用程序中使用一些类.我需要一些关于如何处理这个问题的建议.我可以从jar中导入其中的一些类,但我不知道如何在Android上编译/运行它.任何建议表示赞赏谢谢
最近我一直在为JVM编程语言编写一个编译器,我意识到了一个问题.
我想从我的编程语言中访问Java方法,并允许Java方法以我的语言访问方法.问题是我需要知道Java方法签名,以便在我生成的字节码中调用它,反之亦然.
我一直在试图考虑Scala如何做到这一点的任何方法.这是我的想法.
.java类路径上的文件并解析它们,从那里提取方法签名. .java文件被编译为.class文件.然后使用Java ASM库来访问.class文件并获取方法签名.此方法的问题是.java必须首先编译文件. .java使用反射动态加载文件.这个问题是我认为JVM不允许加载编译器类路径之外的类. 查看Scala,它可以很好地与其他JVM语言配合使用,但我无法找到有关它如何实现的信息.
Scala如何获取其他JVM语言方法的方法签名?
java compiler-construction programming-languages scala java-bytecode-asm
我试图获取Java程序的方法参数的值.我正在使用ASM来检测字节码并获取这些值.但是,我遇到了一些麻烦.
这是用于检测代码的visitCode()方法.它正在做的是:
.
@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-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)