⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 programclassreader.java

📁 ProGuard 是一个免费的 Java类文件的压缩
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * 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 + -