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

📄 utf8usagemarker.java

📁 proguard 一个java的混淆器
💻 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.obfuscate;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.visitor.*;import proguard.classfile.constant.*;import proguard.classfile.constant.visitor.ConstantVisitor;import proguard.classfile.util.SimplifiedVisitor;import proguard.classfile.visitor.*;/** * This ClassVisitor marks all UTF-8 constant pool entries that are * being used in the program classes it visits. * * @see Utf8Shrinker * * @author Eric Lafortune */public class Utf8UsageMarkerextends      SimplifiedVisitorimplements   ClassVisitor,             MemberVisitor,             ConstantVisitor,             AttributeVisitor,             InnerClassesInfoVisitor,             LocalVariableInfoVisitor,             LocalVariableTypeInfoVisitor,             AnnotationVisitor,             ElementValueVisitor{    // A visitor info flag to indicate the UTF-8 constant pool entry is being used.    private static final Object USED = new Object();    // Implementations for ClassVisitor.    public void visitProgramClass(ProgramClass programClass)    {        // Mark the UTF-8 entries referenced by the other constant pool entries.        programClass.constantPoolEntriesAccept(this);        // Mark the UTF-8 entries referenced by the fields and methods.        programClass.fieldsAccept(this);        programClass.methodsAccept(this);        // Mark the UTF-8 entries referenced by the attributes.        programClass.attributesAccept(this);    }    // Implementations for MemberVisitor.    public void visitProgramMember(ProgramClass programClass, ProgramMember programMember)    {        // Mark the name and descriptor UTF-8 entries.        markCpUtf8Entry(programClass, programMember.u2nameIndex);        markCpUtf8Entry(programClass, programMember.u2descriptorIndex);        // Mark the UTF-8 entries referenced by the attributes.        programMember.attributesAccept(programClass, this);    }    // Implementations for ConstantVisitor.    public void visitAnyConstant(Clazz clazz, Constant constant) {}    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)    {        markCpUtf8Entry(clazz, stringConstant.u2stringIndex);    }    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)    {        markCpUtf8Entry(clazz, classConstant.u2nameIndex);    }    public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant)    {        markCpUtf8Entry(clazz, nameAndTypeConstant.u2nameIndex);        markCpUtf8Entry(clazz, nameAndTypeConstant.u2descriptorIndex);    }    // Implementations for AttributeVisitor.    public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)    {        // This is the best we can do for unknown attributes.        markCpUtf8Entry(clazz, unknownAttribute.u2attributeNameIndex);    }    public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)    {        markCpUtf8Entry(clazz, sourceFileAttribute.u2attributeNameIndex);        markCpUtf8Entry(clazz, sourceFileAttribute.u2sourceFileIndex);    }    public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)    {        markCpUtf8Entry(clazz, sourceDirAttribute.u2attributeNameIndex);        markCpUtf8Entry(clazz, sourceDirAttribute.u2sourceDirIndex);    }    public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)    {        markCpUtf8Entry(clazz, innerClassesAttribute.u2attributeNameIndex);        // Mark the UTF-8 entries referenced by the inner classes.        innerClassesAttribute.innerClassEntriesAccept(clazz, this);    }    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)    {        markCpUtf8Entry(clazz, enclosingMethodAttribute.u2attributeNameIndex);        // These entries have already been marked in the constant pool.        //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2classIndex);        //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2nameAndTypeIndex);    }    public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)    {        markCpUtf8Entry(clazz, deprecatedAttribute.u2attributeNameIndex);    }    public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)    {        markCpUtf8Entry(clazz, syntheticAttribute.u2attributeNameIndex);    }    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)    {        markCpUtf8Entry(clazz, signatureAttribute.u2attributeNameIndex);        markCpUtf8Entry(clazz, signatureAttribute.u2signatureIndex);    }    public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)    {        markCpUtf8Entry(clazz, constantValueAttribute.u2attributeNameIndex);    }    public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)    {        markCpUtf8Entry(clazz, exceptionsAttribute.u2attributeNameIndex);    }    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)    {        markCpUtf8Entry(clazz, codeAttribute.u2attributeNameIndex);        // Mark the UTF-8 entries referenced by the attributes.        codeAttribute.attributesAccept(clazz, method, this);    }    public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)    {        markCpUtf8Entry(clazz, stackMapAttribute.u2attributeNameIndex);    }    public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)    {        markCpUtf8Entry(clazz, stackMapTableAttribute.u2attributeNameIndex);    }    public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)    {        markCpUtf8Entry(clazz, lineNumberTableAttribute.u2attributeNameIndex);    }    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)    {        markCpUtf8Entry(clazz, localVariableTableAttribute.u2attributeNameIndex);        // Mark the UTF-8 entries referenced by the local variables.        localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);    }    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)    {        markCpUtf8Entry(clazz, localVariableTypeTableAttribute.u2attributeNameIndex);        // Mark the UTF-8 entries referenced by the local variable types.        localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);    }    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)    {        markCpUtf8Entry(clazz, annotationsAttribute.u2attributeNameIndex);        // Mark the UTF-8 entries referenced by the annotations.        annotationsAttribute.annotationsAccept(clazz, this);    }    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)    {        markCpUtf8Entry(clazz, parameterAnnotationsAttribute.u2attributeNameIndex);        // Mark the UTF-8 entries referenced by the annotations.        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);    }    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)    {        markCpUtf8Entry(clazz, annotationDefaultAttribute.u2attributeNameIndex);        // Mark the UTF-8 entries referenced by the element value.        annotationDefaultAttribute.defaultValueAccept(clazz, this);    }    // Implementations for InnerClassesInfoVisitor.    public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo)    {        if (innerClassesInfo.u2innerNameIndex != 0)        {            markCpUtf8Entry(clazz, innerClassesInfo.u2innerNameIndex);        }    }    // Implementations for LocalVariableInfoVisitor.    public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)    {        markCpUtf8Entry(clazz, localVariableInfo.u2nameIndex);        markCpUtf8Entry(clazz, localVariableInfo.u2descriptorIndex);    }    // Implementations for LocalVariableTypeInfoVisitor.    public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)    {        markCpUtf8Entry(clazz, localVariableTypeInfo.u2nameIndex);        markCpUtf8Entry(clazz, localVariableTypeInfo.u2signatureIndex);    }    // Implementations for AnnotationVisitor.    public void visitAnnotation(Clazz clazz, Annotation annotation)    {        markCpUtf8Entry(clazz, annotation.u2typeIndex);        // Mark the UTF-8 entries referenced by the element values.        annotation.elementValuesAccept(clazz, this);    }    // Implementations for ElementValueVisitor.    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)    {        if (constantElementValue.u2elementNameIndex != 0)        {            markCpUtf8Entry(clazz, constantElementValue.u2elementNameIndex);        }        // Only the string constant element value refers to a UTF-8 entry.        if (constantElementValue.u1tag == ClassConstants.ELEMENT_VALUE_STRING_CONSTANT)        {            markCpUtf8Entry(clazz, constantElementValue.u2constantValueIndex);        }    }    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)    {        if (enumConstantElementValue.u2elementNameIndex != 0)        {            markCpUtf8Entry(clazz, enumConstantElementValue.u2elementNameIndex);        }        markCpUtf8Entry(clazz, enumConstantElementValue.u2typeNameIndex);        markCpUtf8Entry(clazz, enumConstantElementValue.u2constantNameIndex);    }    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)    {        if (classElementValue.u2elementNameIndex != 0)        {            markCpUtf8Entry(clazz, classElementValue.u2elementNameIndex);        }        markCpUtf8Entry(clazz, classElementValue.u2classInfoIndex);    }    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)    {        if (annotationElementValue.u2elementNameIndex != 0)        {            markCpUtf8Entry(clazz, annotationElementValue.u2elementNameIndex);        }        // Mark the UTF-8 entries referenced by the annotation.        annotationElementValue.annotationAccept(clazz, this);    }    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)    {        if (arrayElementValue.u2elementNameIndex != 0)        {            markCpUtf8Entry(clazz, arrayElementValue.u2elementNameIndex);        }        // Mark the UTF-8 entries referenced by the element values.        arrayElementValue.elementValuesAccept(clazz, annotation, this);    }    // Small utility methods.    /**     * Marks the given UTF-8 constant pool entry of the given class.     */    private void markCpUtf8Entry(Clazz clazz, int index)    {         markAsUsed((Utf8Constant)((ProgramClass)clazz).getConstant(index));    }    /**     * Marks the given VisitorAccepter as being used.     * In this context, the VisitorAccepter will be a Utf8Constant object.     */    private static void markAsUsed(VisitorAccepter visitorAccepter)    {        visitorAccepter.setVisitorInfo(USED);    }    /**     * Returns whether the given VisitorAccepter has been marked as being used.     * In this context, the VisitorAccepter will be a Utf8Constant object.     */    static boolean isUsed(VisitorAccepter visitorAccepter)    {        return visitorAccepter.getVisitorInfo() == USED;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -