package com.coderising.jvm.print;
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;
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 visitString(StringInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append(printConsName("string")).append("#"+info.getIndex());
System.out.println(buffer);
}
@Override
public void visitNameAndType(NameAndTypeInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append(printConsName("NameAndType")).append("#"+info.getIndex1()).append(":#")
.append(info.getIndex2());
System.out.println(buffer);
}
@Override
public void visitMethodRef(MethodRefInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append(printConsName("MethodRef")).append("#"+info.getClassInfoIndex()).append(".#")
.append(info.getNameAndTypeIndex());
System.out.println(buffer);
}
@Override
public void visitFieldRef(FieldRefInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append(printConsName("FieldRef")).append("#"+info.getClassInfoIndex()).append(".#")
.append(info.getNameAndTypeIndex());
System.out.println(buffer);
}
@Override
public void visitClassInfo(ClassInfo info) {
StringBuilder buffer = new StringBuilder();
buffer.append(printConsName("Class")).append("#"+info.getUtf8Index())
.append(" ").append(info.getClassName());
System.out.println(buffer);
}
@Override
public void visistUTF8(UTF8Info info) {
StringBuilder buffer = new StringBuilder();
buffer.append(printConsName("UTF8")).append(info.getValue());
System.out.println(buffer);
}
};
int size = pool.getSize();
for(int i=1; i<=size; i++){
ConstantInfo constantInfo = pool.getConstantInfo(i);
String space = genaralSpace(size,i);
System.out.print(space+"#"+i+"=");
constantInfo.accept(visitor);
}
}
private String genaralSpace(int size,int i){
int s1 = String.valueOf(size).length();//数字的位数
int s2 = String.valueOf(i).length();//数字的位数
StringBuffer str = new StringBuffer();
for (int j = 0; j < s1-s2; j++) {
str.append(" ");
}
return str.toString();
}
/**
* 输出常量名称后面的空格
* @param consBeforStr
*/
private String printConsName(String consName){
String bashStr = "NameAndType";
int bashLen = bashStr.length();
int offset = bashLen-consName.length();
for (int i = 0; i < offset; i++) {
consName+= " ";
}
return consName+" ";
}
}