package com.coderising.jvm.print;
import java.util.Formatter;
import com.coderising.jvm.constant.ClassInfo;
import com.coderising.jvm.constant.ConstantInfo;
import com.coderising.jvm.constant.ConstantInfo.Visitor;
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;
public class ConstantPoolPrinter {
ConstantPool pool;
ConstantPoolPrinter(ConstantPool pool){
this.pool = pool;
}
public void print(){
System.out.println("Constant Pool:");
Formatter formatter = new Formatter(System.out);
ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() {
@Override
public void visitUTF8(UTF8Info info) {
StringBuilder buffer = new StringBuilder();
buffer.append("UTF8");
formatter.format("%-15s %-10s\n",
"UTF8",info.getValue());
}
@Override
public void visitString(StringInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("#").append(info.getIndex());
formatter.format("%-15s %-10s %-10s\n",
"String", buffer, "// "+pool.getUTF8String(info.getIndex()));
}
@Override
public void visitNameAndType(NameAndTypeInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("#").append(info.getIndex1()).append(":#")
.append(info.getIndex2());
formatter.format("%-15s %-10s %-10s\n",
"NameAndType", buffer,
"// "+pool.getUTF8String(info.getIndex1())+":"+pool.getUTF8String(info.getIndex2()));
}
@Override
public void visitMethodRef(MethodRefInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("#").append(info.getClassInfoIndex()).append(".#")
.append(info.getNameAndTypeIndex());
formatter.format("%-15s %-10s %-10s\n",
"MethodRef", buffer,
"// "+info.getClassName()+"."+info.getMethodName()+":"+info.getParamAndReturnType());
}
@Override
public void visitFieldRef(FieldRefInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("#").append(info.getClassInfoIndex()).append(".#")
.append(info.getNameAndTypeIndex());
formatter.format("%-15s %-10s %-10s\n",
"FieldRef", buffer,
"// "+info.getClassName()+"."+info.getFieldName()+":"+info.getFieldType());
}
@Override
public void visitClassInfo(ClassInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append("#").append(info.getUtf8Index());
formatter.format("%-15s %-10s %-10s\n",
"Class", buffer, "// "+info.getClassName());
}
};
for(int i = 1; i <= pool.getSize(); i++) {
ConstantInfo constantInfo = pool.getConstantInfo(i);
System.out.printf("%8s", "#" + i + " = ");//左对齐,8个空格
constantInfo.accept(visitor);
}
}
}