package print;
import constant.*;
/**
* Created by gongxun on 2017/4/21.
*/
public class ConstantPoolPrinter {
ConstantPool pool;
ConstantPoolPrinter(ConstantPool pool) {
this.pool = pool;
}
public void print() {
System.out.println("Constant Pool:");
ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() {
@Override
public void visitClassInfo(ClassInfo info) {
// #7 = Class #44 // jvm_1/EmployeeV1
StringBuilder sb = new StringBuilder();
sb.append("Class")
.append("\t\t\t")
.append("#" + info.getUtf8Index())
.append("\t\t\t\t")
.append("//\t")
.append(info.getClassName());
System.out.println(sb.toString());
}
@Override
public void visitFieldRef(FieldRefInfo info) {
// #2 = Fieldref #7.#37 // jvm_1/EmployeeV1.name:Ljava/lang/String;
StringBuilder sb = new StringBuilder();
sb.append("Fieldref")
.append("\t\t")
.append("#" + info.getClassInfoIndex())
.append(".")
.append("#" + info.getNameAndTypeIndex())
.append("\t\t\t")
.append("//\t")
.append(info.getClassName())
.append(".")
.append(info.getFieldName())
.append(info.getFieldType());
System.out.println(sb.toString());
}
@Override
public void visitMethodRef(MethodRefInfo info) {
// #1 = Methodref #11.#36 // java/lang/Object."<init>":()V
StringBuilder sb = new StringBuilder();
sb.append("Methodref")
.append("\t\t")
.append("#" + info.getClassInfoIndex())
.append(".")
.append("#" + info.getNameAndTypeIndex())
.append("\t\t\t")
.append("//\t")
.append(info.getClassName())
.append(".")
.append(info.getMethodName());
System.out.println(sb.toString());
}
@Override
public void visitNameAndType(NameAndTypeInfo info) {
// #36 = NameAndType #16:#28 // "<init>":()V
StringBuilder sb = new StringBuilder();
sb.append("NameAndType")
.append("\t\t")
.append("#" + info.getIndex1())
.append(":")
.append("#" + info.getIndex2())
.append("\t\t\t")
.append("//\t")
.append(info.getTypeInfo())
.append(":")
.append(info.getName());
System.out.println(sb.toString());
}
@Override
public void visitString(StringInfo info) {
// #5 = String #41 // Hello , this is class Employee
StringBuilder sb = new StringBuilder();
sb.append("String")
.append("\t\t\t")
.append("#" + info.getIndex())
.append("\t\t\t\t")
.append("//\t")
.append(((UTF8Info) info.getConstantInfo(info.getIndex())).getValue());
System.out.println(sb.toString());
}
@Override
public void visistUTF8(UTF8Info info) {
// #32 = Utf8 [Ljava/lang/String;
StringBuilder sb = new StringBuilder();
sb.append("Utf8")
.append("\t\t\t")
.append(info.getValue());
System.out.println(sb.toString());
}
};
for (int i = 1; i < (Integer) pool.getSize(); i++) {
ConstantInfo constantInfo = pool.getConstantInfo(i);
System.out.print("#" + i + "\t=\t");
constantInfo.accept(visitor);
}
}
}