package com.coderising.jvm.print;
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:");
ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() {
@Override
public void visitUTF8(UTF8Info info) {
StringBuffer buffer = new StringBuffer();
buffer.append("Utf8 ").append(info.getValue());
System.out.println(buffer);
}
@Override
public void visitString(StringInfo info) {
StringBuffer buffer = new StringBuffer();
buffer.append("String #").append(info.getIndex());
System.out.println(buffer);
}
@Override
public void visitNameAndType(NameAndTypeInfo info) {
StringBuffer buffer = new StringBuffer();
buffer.append("NameAndTypeInfo #").append(info.getIndex1()).append(
info.getIndex2());
System.out.println(buffer);
}
@Override
public void visitMethodRef(MethodRefInfo info) {
StringBuffer buffer = new StringBuffer();
buffer.append("MethodRefInfo #").append(info.getClassInfoIndex()+"#").append(
info.getNameAndTypeIndex());
System.out.println(buffer);
}
@Override
public void visitFieldRef(FieldRefInfo info) {
StringBuffer buffer = new StringBuffer();
buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(
info.getNameAndTypeIndex());
System.out.println(buffer);
}
@Override
public void visitClassInfo(ClassInfo info) {
StringBuffer buffer = new StringBuffer();
buffer.append("Class #").append(info.getUtf8Index());
System.out.println(buffer);
}
};
for (int i = 1; i <= pool.getSize(); i++) {
ConstantInfo constatnInfo = pool.getConstantInfo(i);
System.out.print("#"+i+" = ");
constatnInfo.accept(visitor);
}
}
}