classutil.java

来自「proguard 一个java的混淆器」· Java 代码 · 共 1,103 行 · 第 1/4 页

JAVA
1,103
字号
        // Prepend the array part, if any.        for (int count = 0; count < dimensionCount; count++)        {            internalType = ClassConstants.INTERNAL_TYPE_ARRAY + internalType;        }        return internalType;    }    /**     * Returns the number of dimensions of the given external type.     * @param externalType the external type,     *                     e.g. "<code>[[Ljava/lang/Object;</code>".     * @return the number of dimensions, e.g. 2.     */    public static int externalArrayTypeDimensionCount(String externalType)    {        int dimensions = 0;        int length = ClassConstants.EXTERNAL_TYPE_ARRAY.length();        int offset = externalType.length() - length;        while (externalType.regionMatches(offset,                                          ClassConstants.EXTERNAL_TYPE_ARRAY,                                          0,                                          length))        {            dimensions++;            offset -= length;        }        return dimensions;    }    /**     * Converts an internal type into an external type.     * @param internalType the internal type,     *                     e.g. "<code>[[Ljava/lang/Object;</code>" or     *                          "<code>[I</code>".     * @return the external type,     *                     e.g. "<code>java.lang.Object[][]</code>" or     *                          "<code>int[]</code>".     */    public static String externalType(String internalType)    {        // Strip the array part, if any.        int dimensionCount = internalArrayTypeDimensionCount(internalType);        if (dimensionCount > 0)        {            internalType = internalType.substring(dimensionCount);        }        // Analyze the actual type part.        char internalTypeChar = internalType.charAt(0);        String externalType =            internalTypeChar == ClassConstants.INTERNAL_TYPE_VOID        ?                                ClassConstants.EXTERNAL_TYPE_VOID        :            internalTypeChar == ClassConstants.INTERNAL_TYPE_BOOLEAN     ?                                ClassConstants.EXTERNAL_TYPE_BOOLEAN     :            internalTypeChar == ClassConstants.INTERNAL_TYPE_BYTE        ?                                ClassConstants.EXTERNAL_TYPE_BYTE        :            internalTypeChar == ClassConstants.INTERNAL_TYPE_CHAR        ?                                ClassConstants.EXTERNAL_TYPE_CHAR        :            internalTypeChar == ClassConstants.INTERNAL_TYPE_SHORT       ?                                ClassConstants.EXTERNAL_TYPE_SHORT       :            internalTypeChar == ClassConstants.INTERNAL_TYPE_INT         ?                                ClassConstants.EXTERNAL_TYPE_INT         :            internalTypeChar == ClassConstants.INTERNAL_TYPE_FLOAT       ?                                ClassConstants.EXTERNAL_TYPE_FLOAT       :            internalTypeChar == ClassConstants.INTERNAL_TYPE_LONG        ?                                ClassConstants.EXTERNAL_TYPE_LONG        :            internalTypeChar == ClassConstants.INTERNAL_TYPE_DOUBLE      ?                                ClassConstants.EXTERNAL_TYPE_DOUBLE      :            internalTypeChar == '%'                                      ?                                "%"                                      :            internalTypeChar == ClassConstants.INTERNAL_TYPE_CLASS_START ?                                externalClassName(internalType.substring(1, internalType.indexOf(ClassConstants.INTERNAL_TYPE_CLASS_END))) :                                null;        if (externalType == null)        {            throw new IllegalArgumentException("Unknown type ["+internalType+"]");        }        // Append the array part, if any.        for (int count = 0; count < dimensionCount; count++)        {            externalType += ClassConstants.EXTERNAL_TYPE_ARRAY;        }        return externalType;    }    /**     * Returns whether the given internal descriptor String represents a method     * descriptor.     * @param internalDescriptor the internal descriptor String,     *                           e.g. "<code>(II)Z</code>".     * @return <code>true</code> if the given String is a method descriptor,     *         <code>false</code> otherwise.     */    public static boolean isInternalMethodDescriptor(String internalDescriptor)    {        return internalDescriptor.charAt(0) == ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN;    }    /**     * Returns whether the given member String represents an external method     * name with arguments.     * @param externalMemberNameAndArguments the external member String,     *                                       e.g. "<code>myField</code>" or     *                                       e.g. "<code>myMethod(int,int)</code>".     * @return <code>true</code> if the given String refers to a method,     *         <code>false</code> otherwise.     */    public static boolean isExternalMethodNameAndArguments(String externalMemberNameAndArguments)    {        return externalMemberNameAndArguments.indexOf(ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN) > 0;    }    /**     * Returns the name part of the given external method name and arguments.     * @param externalMethodNameAndArguments the external method name and arguments,     *                                       e.g. "<code>myMethod(int,int)</code>".     * @return the name part of the String, e.g. "<code>myMethod</code>".     */    public static String externalMethodName(String externalMethodNameAndArguments)    {        externalTypeEnumeration.setDescriptor(externalMethodNameAndArguments);        return externalTypeEnumeration.methodName();    }    /**     * Converts the given external method return type and name and arguments to     * an internal method descriptor.     * @param externalReturnType             the external method return type,     *                                       e.g. "<code>boolean</code>".     * @param externalMethodNameAndArguments the external method name and arguments,     *                                       e.g. "<code>myMethod(int,int)</code>".     * @return the internal method descriptor,     *                                       e.g. "<code>(II)Z</code>".     */    public static String internalMethodDescriptor(String externalReturnType,                                                  String externalMethodNameAndArguments)    {        StringBuffer internalMethodDescriptor = new StringBuffer();        internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN);        externalTypeEnumeration.setDescriptor(externalMethodNameAndArguments);        while (externalTypeEnumeration.hasMoreTypes())        {            internalMethodDescriptor.append(internalType(externalTypeEnumeration.nextType()));        }        internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE);        internalMethodDescriptor.append(internalType(externalReturnType));        return internalMethodDescriptor.toString();    }    /**     * Converts the given external method return type and List of arguments to     * an internal method descriptor.     * @param externalReturnType the external method return type,     *                                       e.g. "<code>boolean</code>".     * @param externalArguments the external method arguments,     *                                       e.g. <code>{ "int", "int" }</code>.     * @return the internal method descriptor,     *                                       e.g. "<code>(II)Z</code>".     */    public static String internalMethodDescriptor(String externalReturnType,                                                  List   externalArguments)    {        StringBuffer internalMethodDescriptor = new StringBuffer();        internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN);        for (int index = 0; index < externalArguments.size(); index++)        {            internalMethodDescriptor.append(internalType((String)externalArguments.get(index)));        }        internalMethodDescriptor.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE);        internalMethodDescriptor.append(internalType(externalReturnType));        return internalMethodDescriptor.toString();    }    /**     * Converts an internal field description into an external full field description.     * @param accessFlags             the access flags of the field.     * @param fieldName               the field name,     *                                e.g. "<code>myField</code>".     * @param internalFieldDescriptor the internal field descriptor,     *                                e.g. "<code>Z</code>".     * @return the external full field description,     *                                e.g. "<code>public boolean myField</code>".     */    public static String externalFullFieldDescription(int    accessFlags,                                                      String fieldName,                                                      String internalFieldDescriptor)    {        return externalFieldAccessFlags(accessFlags) +               externalType(internalFieldDescriptor) +               ' ' +               fieldName;    }    /**     * Converts an internal method description into an external full method description.     * @param internalClassName        the internal name of the class of the method,     *                                 e.g. "<code>mypackage/MyClass</code>".     * @param accessFlags              the access flags of the method.     * @param internalMethodName       the internal method name,     *                                 e.g. "<code>myMethod</code>" or     *                                      "<code>&lt;init&gt;</code>".     * @param internalMethodDescriptor the internal method descriptor,     *                                 e.g. "<code>(II)Z</code>".     * @return the external full method description,     *                                 e.g. "<code>public boolean myMethod(int,int)</code>" or     *                                      "<code>public MyClass(int,int)</code>".     */    public static String externalFullMethodDescription(String internalClassName,                                                       int    accessFlags,                                                       String internalMethodName,                                                       String internalMethodDescriptor)    {        return externalMethodAccessFlags(accessFlags) +               externalMethodReturnTypeAndName(internalClassName,                                               internalMethodName,                                               internalMethodDescriptor) +               ClassConstants.EXTERNAL_METHOD_ARGUMENTS_OPEN +               externalMethodArguments(internalMethodDescriptor) +               ClassConstants.EXTERNAL_METHOD_ARGUMENTS_CLOSE;    }    /**     * Converts internal class access flags into an external access description.     * @param accessFlags the class access flags.     * @return the external class access description,     *         e.g. "<code>public final </code>".     */    public static String externalClassAccessFlags(int accessFlags)    {        return externalClassAccessFlags(accessFlags, "");    }    /**     * Converts internal class access flags into an external access description.     * @param accessFlags the class access flags.     * @param prefix      a prefix that is added to each access modifier.     * @return the external class access description,     *         e.g. "<code>public final </code>".     */    public static String externalClassAccessFlags(int accessFlags, String prefix)    {        if (accessFlags == 0)        {            return EMPTY_STRING;        }        StringBuffer string = new StringBuffer(50);        if ((accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0)        {            string.append(prefix).append(ClassConstants.EXTERNAL_ACC_PUBLIC).append(' ');

⌨️ 快捷键说明

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