package com.coding.basic.homework_04.jvm.print; import com.coding.basic.homework_04.jvm.constant.ConstantInfo; import com.coding.basic.homework_04.jvm.constant.ConstantInfo.Visitor; import com.coding.basic.homework_04.jvm.constant.ConstantPool; import com.coding.basic.homework_04.jvm.info.ClassInfo; import com.coding.basic.homework_04.jvm.info.FieldRefInfo; import com.coding.basic.homework_04.jvm.info.MethodRefInfo; import com.coding.basic.homework_04.jvm.info.NameAndTypeInfo; import com.coding.basic.homework_04.jvm.info.StringInfo; import com.coding.basic.homework_04.jvm.info.UTF8Info; public class ConstantPoolPrinter { ConstantPool pool; ConstantPoolPrinter(ConstantPool pool){ this.pool = pool; } public void print(){ System.out.println("Constant Pool:"); ConstantInfo.Visitor consoleVisitor = new Visitor() { @Override public void visitString(StringInfo info) { StringBuilder builder = new StringBuilder(); int stringIndex = info.getString_index(); builder.append("String #").append(stringIndex) .append(" //" + pool.getUTF8String(stringIndex)); System.out.println(builder.toString()); } @Override public void visitNameAndType(NameAndTypeInfo info) { StringBuilder builder = new StringBuilder(); int index1 = info.getIndex1(); int index2 = info.getIndex2(); builder.append("NameAndType #").append(index1 +":#") .append(index2) .append(" //" + pool.getUTF8String(index1)) .append(":" + pool.getUTF8String(index2)); System.out.println(builder.toString()); } @Override public void visitMethodRef(MethodRefInfo info) { StringBuilder builder = new StringBuilder(); int clzIndex = info.getClass_index(); int nameAndTypeIndex = info.getNameAndType_index(); ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(clzIndex); NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex); builder.append("MethodRef #").append(clzIndex+".#") .append(nameAndTypeIndex) .append(" //"+ clzInfo.getClassName()) .append("." + pool.getUTF8String(nameAndTypeInfo.getIndex1()) + ":") .append(pool.getUTF8String(nameAndTypeInfo.getIndex2())); System.out.println(builder.toString()); } @Override public void visitFieldRef(FieldRefInfo info) { StringBuilder builder = new StringBuilder(); int clzIndex = info.getClz_index(); int nameAndTypeIndex = info.getNameAndType_index(); ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(clzIndex); NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex); builder.append("FieldRef #").append(clzIndex + ".#") .append(nameAndTypeIndex) .append(" //" + clzInfo.getClassName()) .append("." + pool.getUTF8String(nameAndTypeInfo.getIndex1()) + ":") .append(pool.getUTF8String(nameAndTypeInfo.getIndex2())); System.out.println(builder.toString()); } @Override public void visitClassInfo(ClassInfo info) { StringBuilder builder = new StringBuilder(); builder.append("Class #").append(info.getUtf8Index()+" //") .append(info.getClassName()); System.out.println(builder.toString()); } @Override public void visistUTF8(UTF8Info info) { StringBuilder builder = new StringBuilder(); builder.append("Utf8 ").append(info.getValue()); System.out.println(builder.toString()); } }; for(int i = 1; i <= pool.getSize(); i++){ System.out.print("#" + i + " = "); pool.getConstantInfo(i).accept(consoleVisitor); } } }