我使用ASM,這非常簡單。我有一個org.objectweb.asm.commons.Remapper的實現,它將類的名稱和描述符更改爲新類。
例如其中一種方法是這樣的:
@Override
public String mapDesc(String desc) {
return super.mapDesc(StringUtil.fixDesc(desc, renamed));
}
的描述如下所示:LCOM /示例/類;。我將這個字段'重命名爲',我將其添加到fixDesc中,這是一個包含舊值到新值的類映射的映射。所以,如果我想使COM /例子/ AAA到COM /例子/ 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;
}
爲什麼會有人想修改一個編譯的類? –
@Vishal Kamat,如果你想不出爲什麼,那就意味着你不需要。在某些情況下它可能很有用,例如,添加一個額外的方法並在沒有源代碼的類上實現一個接口。在我的情況只是一個沙箱測試。 –
在這種情況下,AOP是你的朋友。很多東西在做它只是你提到的 –