package com.coderising.jvm.print;
import java.nio.Buffer;
import com.coderising.jvm.clz.ClassFile;
import com.coderising.jvm.constant.ClassInfo;
import com.coderising.jvm.constant.ConstantInfo;
import com.coderising.jvm.constant.ConstantPool;
import com.coderising.jvm.constant.FieldRefInfo;
import com.coderising.jvm.constant.MethodRefInfo;
import com.coderising.jvm.constant.NameAndTypeInfo;
import com.coderising.jvm.constant.StringInfo;
import com.coderising.jvm.constant.UTF8Info;
import com.coderising.jvm.loader.ClassFileLoader;
public class ConstantPoolPrinter {
ConstantPool pool;
ConstantPoolPrinter(ConstantPool pool){
this.pool = pool;
}
public void print(){
System.out.println("Constant Pool:");
for (int i = 0; i < pool.getSize(); i++) {
ConstantInfo info=pool.getConstantInfo(i);
StringBuffer pringBuffer=new StringBuffer();
if (i<10) {
pringBuffer.append(" #"+Integer.toString(i)+" ");
}
else {
pringBuffer.append("#"+Integer.toString(i)+" ");
}
if (info instanceof UTF8Info) {
pringBuffer.append("Utf8");
String buffer=String.format("%-30s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
UTF8Info utf8Info=(UTF8Info)info;
pringBuffer.append(utf8Info.getValue());
}
else if (info instanceof ClassInfo) {
pringBuffer.append("Class");
String buffer=String.format("%-30s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
ClassInfo classInfo=(ClassInfo)info;
pringBuffer.append("#"+Integer.toString(classInfo.getUtf8Index()));
buffer=String.format("%-40s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
UTF8Info utf8Info=(UTF8Info)pool.getConstantInfo(classInfo.getUtf8Index());
pringBuffer.append("// "+utf8Info.getValue());
}
else if (info instanceof NameAndTypeInfo) {
pringBuffer.append("NameAndType");
String buffer=String.format("%-30s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
NameAndTypeInfo nameAndTypeInfo=(NameAndTypeInfo)info;
int index1=nameAndTypeInfo.getIndex1();
int index2=nameAndTypeInfo.getIndex2();
pringBuffer.append("#"+Integer.toString(index1)+";"+"#"+Integer.toString(index2));
buffer=String.format("%-40s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
String string1=((UTF8Info)pool.getConstantInfo(index1)).getValue();
String string2=((UTF8Info)pool.getConstantInfo(index2)).getValue();
pringBuffer.append("// "+string1+";"+string2);
}
else if (info instanceof FieldRefInfo) {
pringBuffer.append("FieldRef");
String buffer=String.format("%-30s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
FieldRefInfo fieldRefInfo=(FieldRefInfo)info;
int classInfoIndex=fieldRefInfo.getClassInfoIndex();
int nameAndTypeIndex=fieldRefInfo.getNameAndTypeIndex();
pringBuffer.append("#"+Integer.toString(classInfoIndex)+";"+"#"+Integer.toString(nameAndTypeIndex));
buffer=String.format("%-40s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
int index1=((ClassInfo)pool.getConstantInfo(classInfoIndex)).getUtf8Index();
int index2=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex1();
int index3=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex2();
String string1=((UTF8Info)pool.getConstantInfo(index1)).getValue();
String string2=((UTF8Info)pool.getConstantInfo(index2)).getValue();
String string3=((UTF8Info)pool.getConstantInfo(index3)).getValue();
pringBuffer.append("// "+string1+";"+string2+";"+string3);
}
else if (info instanceof MethodRefInfo) {
pringBuffer.append("MethodRef");
String buffer=String.format("%-30s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
MethodRefInfo methodRefInfo=(MethodRefInfo)info;
int classInfoIndex=methodRefInfo.getClassInfoIndex();
int nameAndTypeIndex=methodRefInfo.getNameAndTypeIndex();
pringBuffer.append("#"+Integer.toString(classInfoIndex)+";"+"#"+Integer.toString(nameAndTypeIndex));
buffer=String.format("%-40s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
int index1=((ClassInfo)pool.getConstantInfo(classInfoIndex)).getUtf8Index();
int index2=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex1();
int index3=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex2();
String string1=((UTF8Info)pool.getConstantInfo(index1)).getValue();
String string2=((UTF8Info)pool.getConstantInfo(index2)).getValue();
String string3=((UTF8Info)pool.getConstantInfo(index3)).getValue();
pringBuffer.append("// "+string1+";"+string2+";"+string3);
}
else if (info instanceof StringInfo) {
pringBuffer.append("String");
String buffer=String.format("%-30s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
StringInfo stringInfo=(StringInfo)info;
pringBuffer.append("#"+Integer.toString(stringInfo.getIndex()));
buffer=String.format("%-40s", pringBuffer);
pringBuffer=new StringBuffer(buffer);
UTF8Info utf8Info=(UTF8Info)pool.getConstantInfo(stringInfo.getIndex());
pringBuffer.append("// "+utf8Info.getValue());
}
System.out.println(pringBuffer);
}
}
public static void main(String[] args) {
String path = "F:\\mycoding2017\\group11\\996108220\\bin";
ClassFileLoader loader = new ClassFileLoader();
loader.addClassPath(path);
String className = "com.coderising.jvm.test.EmployeeV1";
ClassFile clzFile = loader.loadClass(className);
ConstantPool pool=clzFile.getConstantPool();
ConstantPoolPrinter printer=new ConstantPoolPrinter(pool);
printer.print();
}
}