Управление байтовым кодом, сгенерированным из ASM - PullRequest
6 голосов
/ 19 июня 2020

Я хочу сгенерировать байтовый код для класса java только с publi c или защищенными полями, конструкторами и методами.

Я пытаюсь использовать приведенный ниже код, но не знать правильный ли подход?

Код клиента:

String sourceFileName = file.getName();
ClassReader reader = new ClassReader(file.getContents());
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
JavaStubClassAdapter adapter = new JavaStubClassAdapter(writer, sourceFileName);
reader.accept(adapter, 0);
byte[] content = writer.toByteArray();
// we can use content to print in .class file

Код адаптера:

private class JavaStubClassAdapter extends ClassVisitor {
    private final String sourceFileName;

    /**
     * @param writer
     * @param sourceFileName
     */
    public JavaStubClassAdapter(ClassWriter writer, String sourceFileName) {
        super(Opcodes.ASM7, writer);
        this.sourceFileName = sourceFileName;
    }

    @Override
    public void visitSource(String source, String debug) {
        super.visitSource(this.sourceFileName, null);
    }

    @Override
    public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
        if (access == Opcodes.ACC_PUBLIC || access == Opcodes.ACC_PROTECTED) {
            return super.visitField(access, name, descriptor, signature, value);
        }
        return null;
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String descriptor, String signature,
            String[] exceptions) {
        if (access == Opcodes.ACC_PUBLIC || access == Opcodes.ACC_PROTECTED) {
            return super.visitMethod(access, name, descriptor, signature, exceptions);
        }
        return null;
    }
}

1 Ответ

0 голосов
/ 29 июня 2020

Прямо из ASM FAQ по адресу https://asm.ow2.io/faq.html#Q11

Если вы хотите знать, как сгенерировать синхронизированный блок, блок try catch, оператор finally или любой другой другая конструкция Java, напишите код Java, который вы хотите сгенерировать во временном классе, скомпилируйте его с помощью javac, а затем используйте ASMifier , чтобы получить код ASM, который будет генерировать этот класс.

...