2015-11-30 39 views
0

对于我正在处理的项目,我尝试使用ASM重命名jar文件中的类。我有它的工作......但有一个问题。在jar中重命名的每个类都具有重复的字段。重命名类中的重复字段(ASM + Jar)

这里是我的代码:

import org.objectweb.asm.ClassReader; 
import org.objectweb.asm.ClassWriter; 
import org.objectweb.asm.commons.Remapper; 
import org.objectweb.asm.commons.RemappingClassAdapter; 
import org.objectweb.asm.commons.SimpleRemapper; 
import org.objectweb.asm.tree.ClassNode; 
//Imports showing which ASM (5.0.4) classes I'm using 

private static void doStuff() throws IOException { 
    File jar = new File("Input.jar"); 
    //Get's the ClassNodes for each class in a jar 
    ArrayList<ClassNode> nodes = BCU.loadClasses(jar); 
    //Appends '_Test' to each class except for the main class. 
    Remapper mapper = new SimpleRemapper(getRename(nodes)); 
    //Loop through the ClassNodes updating references to renamed classes 
    for (ClassNode cn : nodes) { 
     ClassReader cr = new ClassReader(BCU.getNodeBytes(cn)); 
     ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); 
     RemappingClassAdapter rca = new RemappingClassAdapter(cw, mapper); 
     cr.accept(rca, ClassReader.EXPAND_FRAMES); 
     cr = new ClassReader(cw.toByteArray()); 
     cr.accept(cn,ClassReader.EXPAND_FRAMES); 
    } 
    //Export the nodes as a new jar file and copy over the META-INF folder 
    BCU.saveAsJar(nodes, "Output.jar"); 
} 

输出示例:

public static String VERSION; 
public static final ConfigFile config; 
public static String VERSION; 
public static final ConfigFile_Test config; 

编辑(2016年3月28日):即将学习更多关于ASM后回到这里是它应该如何做:

for (ClassNode cn : nodes.values()) { 
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); 
    //mapper is a Remapper instance 
    ClassVisitor remapper = new RemappingClassAdapter(cw, mapper); 
    cn.accept(remapper); 
    //out = Map<String, byte[]> 
    out.put(renamed.get(cn.name).getRenamed(), cw.toByteArray()); 
} 

锑是正确的。我最初的想法是当我发布这个时候编辑ClassNode本身(我有一个处理所有事情的ClassNode扩展,这非常讨厌)。自从转向Remapper实现以来,事情一直在好转。

+0

那么,你想要什么? – Andremoniy

+0

汇编代码在哪里?我只看到Java。你的意思是使用java-bytecode-asm标签吗? –

+0

@PeterSmith修复了标签。我忘了ASM会扩展到Assembly。 @ Andremoniy我正在尝试重命名jar文件中的类文件。重命名部分起作用,但所有字段都在该过程中重复。这使得jar文件不可用。 –

回答

1
cr.accept(cn,ClassReader.EXPAND_FRAMES); 

问题是,您在现有ClassNode上调用accept。 ClassNode.visitField 字段添加到类节点。因此,ClassNode中的所有内容都加倍了一倍 - 来自现有数据的一个副本和您添加的一个副本。

+0

谢谢,我通过扩展ClassNode来防止重复条目,从而制定了一个便宜的解决方法。 –