📄 classprinter.java
字号:
/* * ProGuard -- shrinking, optimization, obfuscation, and preverification * of Java bytecode. * * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */package proguard.classfile.visitor;import proguard.classfile.*;import proguard.classfile.attribute.*;import proguard.classfile.attribute.annotation.*;import proguard.classfile.attribute.annotation.visitor.*;import proguard.classfile.attribute.preverification.*;import proguard.classfile.attribute.preverification.visitor.*;import proguard.classfile.attribute.visitor.*;import proguard.classfile.constant.*;import proguard.classfile.constant.visitor.ConstantVisitor;import proguard.classfile.instruction.*;import proguard.classfile.instruction.visitor.InstructionVisitor;import proguard.classfile.util.*;import java.io.PrintStream;/** * This <code>ClassVisitor</code> prints out the complete internal * structure of the classes it visits. * * @author Eric Lafortune */public class ClassPrinterextends SimplifiedVisitorimplements ClassVisitor, ConstantVisitor, MemberVisitor, AttributeVisitor, ExceptionInfoVisitor, InnerClassesInfoVisitor, StackMapFrameVisitor, VerificationTypeVisitor, LineNumberInfoVisitor, LocalVariableInfoVisitor, LocalVariableTypeInfoVisitor, AnnotationVisitor, ElementValueVisitor, InstructionVisitor{ private static final String INDENTATION = " "; private PrintStream ps; private int indentation; /** * Creates a new ClassPrinter that prints to <code>System.out</code>. */ public ClassPrinter() { this(System.out); } /** * Creates a new ClassPrinter that prints to the given * <code>PrintStream</code>. */ public ClassPrinter(PrintStream printStream) { ps = printStream; } // Implementations for ClassVisitor. public void visitProgramClass(ProgramClass programClass) { println("_____________________________________________________________________"); println(visitorInfo(programClass) + " " + "Program class: " + programClass.getName()); indent(); println("Superclass: " + programClass.getSuperName()); println("Major version: 0x" + Integer.toHexString(ClassUtil.internalMajorClassVersion(programClass.u4version))); println("Minor version: 0x" + Integer.toHexString(ClassUtil.internalMinorClassVersion(programClass.u4version))); println("Access flags: 0x" + Integer.toHexString(programClass.u2accessFlags)); println(" = " + ClassUtil.externalClassAccessFlags(programClass.u2accessFlags) + ((programClass.u2accessFlags & ClassConstants.INTERNAL_ACC_INTERFACE) == 0 ? "class " : "") + ClassUtil.externalClassName(programClass.getName()) + (programClass.u2superClass == 0 ? "" : " extends " + ClassUtil.externalClassName(programClass.getSuperName()))); outdent(); println(); println("Interfaces (count = " + programClass.u2interfacesCount + "):"); indent(); for (int index = 0; index < programClass.u2interfacesCount; index++) { println("+ " + programClass.getClassName(programClass.u2interfaces[index])); } outdent(); println(); println("Constant Pool (count = " + programClass.u2constantPoolCount + "):"); indent(); programClass.constantPoolEntriesAccept(this); outdent(); println(); println("Fields (count = " + programClass.u2fieldsCount + "):"); indent(); programClass.fieldsAccept(this); outdent(); println(); println("Methods (count = " + programClass.u2methodsCount + "):"); indent(); programClass.methodsAccept(this); outdent(); println(); println("Class file attributes (count = " + programClass.u2attributesCount + "):"); indent(); programClass.attributesAccept(this); outdent(); println(); } public void visitLibraryClass(LibraryClass libraryClass) { println("_____________________________________________________________________"); println(visitorInfo(libraryClass) + " " + "Library class: " + libraryClass.getName()); indent(); println("Superclass: " + libraryClass.getSuperName()); println("Access flags: 0x" + Integer.toHexString(libraryClass.u2accessFlags)); println(" = " + ClassUtil.externalClassAccessFlags(libraryClass.u2accessFlags) + ((libraryClass.u2accessFlags & ClassConstants.INTERNAL_ACC_INTERFACE) == 0 ? "class " : "") + ClassUtil.externalClassName(libraryClass.getName()) + " extends " + ClassUtil.externalClassName(libraryClass.getSuperName())); outdent(); println(); println("Interfaces (count = " + libraryClass.interfaceClasses.length + "):"); for (int index = 0; index < libraryClass.interfaceClasses.length; index++) { Clazz interfaceClass = libraryClass.interfaceClasses[index]; if (interfaceClass != null) { println(" + " + interfaceClass.getName()); } } println("Fields (count = " + libraryClass.fields.length + "):"); libraryClass.fieldsAccept(this); println("Methods (count = " + libraryClass.methods.length + "):"); libraryClass.methodsAccept(this); } // Implementations for ConstantVisitor. public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) { println(visitorInfo(integerConstant) + " Integer [" + integerConstant.getValue() + "]"); } public void visitLongConstant(Clazz clazz, LongConstant longConstant) { println(visitorInfo(longConstant) + " Long [" + longConstant.getValue() + "]"); } public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) { println(visitorInfo(floatConstant) + " Float [" + floatConstant.getValue() + "]"); } public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) { println(visitorInfo(doubleConstant) + " Double [" + doubleConstant.getValue() + "]"); } public void visitStringConstant(Clazz clazz, StringConstant stringConstant) { println(visitorInfo(stringConstant) + " String [" + clazz.getString(stringConstant.u2stringIndex) + "]"); } public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) { println(visitorInfo(utf8Constant) + " Utf8 [" + utf8Constant.getString() + "]"); } public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) { println(visitorInfo(fieldrefConstant) + " Fieldref [" + clazz.getClassName(fieldrefConstant.u2classIndex) + "." + clazz.getName(fieldrefConstant.u2nameAndTypeIndex) + " " + clazz.getType(fieldrefConstant.u2nameAndTypeIndex) + "]"); } public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) { println(visitorInfo(interfaceMethodrefConstant) + " InterfaceMethodref [" + clazz.getClassName(interfaceMethodrefConstant.u2classIndex) + "." + clazz.getName(interfaceMethodrefConstant.u2nameAndTypeIndex) + " " + clazz.getType(interfaceMethodrefConstant.u2nameAndTypeIndex) + "]"); } public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) { println(visitorInfo(methodrefConstant) + " Methodref [" + clazz.getClassName(methodrefConstant.u2classIndex) + "." + clazz.getName(methodrefConstant.u2nameAndTypeIndex) + " " + clazz.getType(methodrefConstant.u2nameAndTypeIndex) + "]"); } public void visitClassConstant(Clazz clazz, ClassConstant classConstant) { println(visitorInfo(classConstant) + " Class [" + clazz.getString(classConstant.u2nameIndex) + "]"); } public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) { println(visitorInfo(nameAndTypeConstant) + " NameAndType [" + clazz.getString(nameAndTypeConstant.u2nameIndex) + " " + clazz.getString(nameAndTypeConstant.u2descriptorIndex) + "]"); } // Implementations for MemberVisitor. public void visitProgramField(ProgramClass programClass, ProgramField programField) { println(visitorInfo(programField) + " " + "Field: " + programField.getName(programClass) + " " + programField.getDescriptor(programClass)); indent(); println("Access flags: 0x" + Integer.toHexString(programField.u2accessFlags)); println(" = " + ClassUtil.externalFullFieldDescription(programField.u2accessFlags, programField.getName(programClass), programField.getDescriptor(programClass))); visitMember(programClass, programField); outdent(); } public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) { println(visitorInfo(programMethod) + " " + "Method: " + programMethod.getName(programClass) + programMethod.getDescriptor(programClass)); indent(); println("Access flags: 0x" + Integer.toHexString(programMethod.u2accessFlags)); println(" = " + ClassUtil.externalFullMethodDescription(programClass.getName(), programMethod.u2accessFlags, programMethod.getName(programClass), programMethod.getDescriptor(programClass))); visitMember(programClass, programMethod); outdent(); } private void visitMember(ProgramClass programClass, ProgramMember programMember) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -