我使用 ASM,这非常容易。我有一个org.objectweb.asm.commons.Remapper的实现,它将类的名称和描述符更改为新的。
例如,其中一种方法如下所示:
@Override
public String mapDesc(String desc) {
return super.mapDesc(StringUtil.fixDesc(desc, renamed));
}
描述如下:Lcom/example/Class;. 我输入 fixDesc的“重命名”字段是我制作的包含旧值到新值的类映射的映射。因此,如果我想将com/example/AAA转换为com/example/BBB,我将之前和之后的值输入到地图中,并像这样调用重映射器:
/**
* Given a map of ClassNodes and mappings, returns a map of class names to
* class bytes.
*/
public static Map<String, byte[]> process(Map<String, ClassNode> nodes, Map<String, MappedClass> mappings) {
Map<String, byte[]> out = new HashMap<String, byte[]>();
RemapperImpl mapper = new RemapperImpl(mappings);
for (ClassNode cn : nodes.values()) {
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
ClassVisitor remapper = new ClassRemapper(cw, mapper);
cn.accept(remapper);
out.put(mappings.get(cn.name).getNewName(), cw.toByteArray());
}
return out;
}