📄 programclassreader.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.io;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.util.*;import proguard.classfile.visitor.*;import java.io.DataInput;/** * This ClassVisitor fills out the ProgramClass objects that it visits with data * from the given DataInput object. * * @author Eric Lafortune */public class ProgramClassReaderextends SimplifiedVisitorimplements ClassVisitor, MemberVisitor, ConstantVisitor, AttributeVisitor, InnerClassesInfoVisitor, ExceptionInfoVisitor, StackMapFrameVisitor, VerificationTypeVisitor, LineNumberInfoVisitor, LocalVariableInfoVisitor, LocalVariableTypeInfoVisitor, AnnotationVisitor, ElementValueVisitor{ private RuntimeDataInput dataInput; /** * Creates a new ProgramClassReader for reading from the given DataInput. */ public ProgramClassReader(DataInput dataInput) { this.dataInput = new RuntimeDataInput(dataInput); } // Implementations for ClassVisitor. public void visitProgramClass(ProgramClass programClass) { // Read and check the magic number. programClass.u4magic = dataInput.readInt(); ClassUtil.checkMagicNumber(programClass.u4magic); // Read and check the version numbers. int u2minorVersion = dataInput.readUnsignedShort(); int u2majorVersion = dataInput.readUnsignedShort(); programClass.u4version = ClassUtil.internalClassVersion(u2majorVersion, u2minorVersion); ClassUtil.checkVersionNumbers(programClass.u4version); // Read the constant pool. Note that the first entry is not used. programClass.u2constantPoolCount = dataInput.readUnsignedShort(); programClass.constantPool = new Constant[programClass.u2constantPoolCount]; for (int index = 1; index < programClass.u2constantPoolCount; index++) { Constant constant = createConstant(); constant.accept(programClass, this); programClass.constantPool[index] = constant; // Long constants and double constants take up two entries in the // constant pool. int tag = constant.getTag(); if (tag == ClassConstants.CONSTANT_Long || tag == ClassConstants.CONSTANT_Double) { programClass.constantPool[++index] = null; } } // Read the general class information. programClass.u2accessFlags = dataInput.readUnsignedShort(); programClass.u2thisClass = dataInput.readUnsignedShort(); programClass.u2superClass = dataInput.readUnsignedShort(); // Read the interfaces. programClass.u2interfacesCount = dataInput.readUnsignedShort(); programClass.u2interfaces = new int[programClass.u2interfacesCount]; for (int index = 0; index < programClass.u2interfacesCount; index++) { programClass.u2interfaces[index] = dataInput.readUnsignedShort(); } // Read the fields. programClass.u2fieldsCount = dataInput.readUnsignedShort(); programClass.fields = new ProgramField[programClass.u2fieldsCount]; for (int index = 0; index < programClass.u2fieldsCount; index++) { ProgramField programField = new ProgramField(); this.visitProgramField(programClass, programField); programClass.fields[index] = programField; } // Read the methods. programClass.u2methodsCount = dataInput.readUnsignedShort(); programClass.methods = new ProgramMethod[programClass.u2methodsCount]; for (int index = 0; index < programClass.u2methodsCount; index++) { ProgramMethod programMethod = new ProgramMethod(); this.visitProgramMethod(programClass, programMethod); programClass.methods[index] = programMethod; } // Read the class attributes. programClass.u2attributesCount = dataInput.readUnsignedShort(); programClass.attributes = new Attribute[programClass.u2attributesCount]; for (int index = 0; index < programClass.u2attributesCount; index++) { Attribute attribute = createAttribute(programClass); attribute.accept(programClass, this); programClass.attributes[index] = attribute; } } public void visitLibraryClass(LibraryClass libraryClass) { } // Implementations for MemberVisitor. public void visitProgramField(ProgramClass programClass, ProgramField programField) { // Read the general field information. programField.u2accessFlags = dataInput.readUnsignedShort(); programField.u2nameIndex = dataInput.readUnsignedShort(); programField.u2descriptorIndex = dataInput.readUnsignedShort(); // Read the field attributes. programField.u2attributesCount = dataInput.readUnsignedShort(); programField.attributes = new Attribute[programField.u2attributesCount]; for (int index = 0; index < programField.u2attributesCount; index++) { Attribute attribute = createAttribute(programClass); attribute.accept(programClass, programField, this); programField.attributes[index] = attribute; } } public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) { // Read the general method information. programMethod.u2accessFlags = dataInput.readUnsignedShort(); programMethod.u2nameIndex = dataInput.readUnsignedShort(); programMethod.u2descriptorIndex = dataInput.readUnsignedShort(); // Read the method attributes. programMethod.u2attributesCount = dataInput.readUnsignedShort(); programMethod.attributes = new Attribute[programMethod.u2attributesCount]; for (int index = 0; index < programMethod.u2attributesCount; index++) { Attribute attribute = createAttribute(programClass); attribute.accept(programClass, programMethod, this); programMethod.attributes[index] = attribute; } } public void visitLibraryMember(LibraryClass libraryClass, LibraryMember libraryMember) { } // Implementations for ConstantVisitor. public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant) { integerConstant.u4value = dataInput.readInt(); } public void visitLongConstant(Clazz clazz, LongConstant longConstant) { longConstant.u8value = dataInput.readLong(); } public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant) { floatConstant.f4value = dataInput.readFloat(); } public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant) { doubleConstant.f8value = dataInput.readDouble(); } public void visitStringConstant(Clazz clazz, StringConstant stringConstant) { stringConstant.u2stringIndex = dataInput.readUnsignedShort(); } public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant) { int u2length = dataInput.readUnsignedShort(); // Read the UTF-8 bytes. byte[] bytes = new byte[u2length]; dataInput.readFully(bytes); utf8Constant.setBytes(bytes); } public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) { refConstant.u2classIndex = dataInput.readUnsignedShort(); refConstant.u2nameAndTypeIndex = dataInput.readUnsignedShort(); } public void visitClassConstant(Clazz clazz, ClassConstant classConstant) { classConstant.u2nameIndex = dataInput.readUnsignedShort(); } public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant) { nameAndTypeConstant.u2nameIndex = dataInput.readUnsignedShort(); nameAndTypeConstant.u2descriptorIndex = dataInput.readUnsignedShort(); } // Implementations for AttributeVisitor. public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) { // Read the unknown information. byte[] info = new byte[unknownAttribute.u4attributeLength]; dataInput.readFully(info); unknownAttribute.info = info; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -