gpt4 book ai didi

java - asm 中的静态初始化程序

转载 作者:行者123 更新时间:2023-11-29 04:00:07 26 4
gpt4 key购买 nike

我想初始化一个静态字段,它是我使用 asm 添加到类中的。如果我可以访问静态初始化程序,那么我就可以进行初始化。

如何初始化静态字段?

最佳答案

我假设您使用 ClassAdapter 添加字段将几乎所有内容委托(delegate)给 ClassWriter但也调用visitField添加新字段。

如果您要添加的字段已初始化为常量。然后你可以简单地直接向 ClassVisitor.visitField 提供一个对象文字。 .

如果您要添加的字段需要复杂的静态初始化,那么您需要覆盖 ClassAdapter.visitMethod检查 <clinit>方法并创建自定义 MethodAdapter添加您想要的代码。代码粗略如下:

class MyAdapter extends ClassAdapter {
public MyAdapter(ClassVisitor delegate) {
super(delegate);
}

@Override
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
MethodVisitor r = super.visitMethod(access, name, desc, signature, exceptions);
if ("<clinit>".equals(name)) {
r = new MyMethodAdapter(r);
}
return r;
}

class MyMethodAdapter extends MethodAdapter {
MyMethodAdapter(MethodVisitor delegate) {
super(delegate);
}

@Override
public void visitCode() {
super.visitCode();
// build my static initializer by calling
// visitFieldInsn(int opcode, String owner, String name, String desc)
// or the like
}
}
}

关于java - asm 中的静态初始化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4135064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com