Я хочу сгенерировать байтовый код для класса 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;
}
}