代写 Java compiler import java.io.File;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.Constant;
import org.apache.bcel.classfile.ConstantPool;
import org.apache.bcel.classfile.ConstantString;
import org.apache.bcel.classfile.ConstantUtf8;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.ConstantPoolGen;
public class CompilerString
{
ClassParser parser = null;
ClassGen gen = null;
JavaClass original = null;
JavaClass optimized = null;
public CompilerString(String classFilePath)
pool
contains
ConstantUtf8
javap)
{
try
{
this.parser = new ClassParser(classFilePath);
this.original = this.parser.parse();
} }
{
// load the original class into a class generator
ClassGen cgen = new ClassGen(original);
ConstantPoolGen cpgen = cgen.getConstantPool();
// get the current constant pool
ConstantPool cp = cpgen.getConstantPool();
// get the constants in the pool
Constant[] constants = cp.getConstantPool();
for (int i = 0; i < constants.length; i++) { // string constants take two entries in the // the first one is of ConstantString, which // an index to the second entry, which is // (displayed Asciz when disassembled by // } catch (IOException e) { e.printStackTrace(); private void optimize() // ConstantUtf8 (Asciz) entries are used to store method names, etc // whereas we are only interested in String constants entry, which we then replace // So we first look for ConstantString entry, // then retrieve the index of ConstantUtf8 constants[i]; new ConstantUtf8("Compiler")); } } } } { } } // TODO Auto-generated catch block e.printStackTrace(); if (constants[i] instanceof ConstantString) { ConstantString cs = (ConstantString) cp.setConstant(cs.getStringIndex(), // we generate a new class with modifications // and store it in a member variable this.optimized = cgen.getJavaClass(); } public void write(String optimisedFilePath) { { FileOutputStream(new File(optimisedFilePath)); this.optimized.dump(out); catch (FileNotFoundException e) // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) this.optimize(); try } { FileOutputStream out = new public static void main(String args[]) { System.out.println(args[0]); CompilerString optimizer = new CompilerString(args[0]); optimizer.write(args[1]);