classutil.java

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

JAVA
1,103
字号
    }    /**     * Returns whether the given internal type is a primitive Category 2 type.     * @param internalType the internal type,     *                     e.g. "<code>L</code>".     * @return <code>true</code> if the given type is a Category 2 type,     *         <code>false</code> otherwise.     */    public static boolean isInternalCategory2Type(String internalType)    {        return internalType.length() == 1 &&               (internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_LONG ||                internalType.charAt(0) == ClassConstants.INTERNAL_TYPE_DOUBLE);    }    /**     * Returns whether the given internal type is a plain class type     * (including an array type of a plain class type).     * @param internalType the internal type,     *                     e.g. "<code>Ljava/lang/Object;</code>".     * @return <code>true</code> if the given type is a class type,     *         <code>false</code> otherwise.     */    public static boolean isInternalClassType(String internalType)    {        int length = internalType.length();        return length > 1 &&//             internalType.charAt(0)        == ClassConstants.INTERNAL_TYPE_CLASS_START &&               internalType.charAt(length-1) == ClassConstants.INTERNAL_TYPE_CLASS_END;    }    /**     * Returns the internal type of a given class name.     * @param internalClassName the internal class name,     *                          e.g. "<code>java/lang/Object</code>".     * @return the internal type,     *                          e.g. "<code>Ljava/lang/Object;</code>".     */    public static String internalTypeFromClassName(String internalClassName)    {        return internalArrayTypeFromClassName(internalClassName, 0);    }    /**     * Returns the internal array type of a given class name with a given number     * of dimensions. If the number of dimensions is 0, the class name itself is     * returned.     * @param internalClassName the internal class name,     *                          e.g. "<code>java/lang/Object</code>".     * @param dimensionCount    the number of array dimensions.     * @return the internal array type of the array elements,     *                          e.g. "<code>Ljava/lang/Object;</code>".     */    public static String internalArrayTypeFromClassName(String internalClassName,                                                        int    dimensionCount)    {        StringBuffer buffer = new StringBuffer(internalClassName.length() + dimensionCount + 2);        for (int dimension = 0; dimension < dimensionCount; dimension++)        {            buffer.append(ClassConstants.INTERNAL_TYPE_ARRAY);        }        return buffer.append(ClassConstants.INTERNAL_TYPE_CLASS_START)                     .append(internalClassName)                     .append(ClassConstants.INTERNAL_TYPE_CLASS_END)                     .toString();    }    /**     * Returns the internal element type of a given internal array type.     * @param internalArrayType the internal array type,     *                          e.g. "<code>[[Ljava/lang/Object;</code>" or     *                               "<code>[I</code>".     * @return the internal type of the array elements,     *                          e.g. "<code>Ljava/lang/Object;</code>" or     *                               "<code>I</code>".     */    public static String internalTypeFromArrayType(String internalArrayType)    {        int index = internalArrayType.lastIndexOf(ClassConstants.INTERNAL_TYPE_ARRAY);        return internalArrayType.substring(index+1);    }    /**     * Returns the internal class name of a given internal class type     * (including an array type). Types involving primitive types are returned     * unchanged.     * @param internalClassType the internal class type,     *                          e.g. "<code>[Ljava/lang/Object;</code>",     *                               "<code>Ljava/lang/Object;</code>", or     *                               "<code>java/lang/Object</code>".     * @return the internal class name,     *                          e.g. "<code>java/lang/Object</code>".     */    public static String internalClassNameFromClassType(String internalClassType)    {        return isInternalClassType(internalClassType) ?            internalClassType.substring(internalClassType.indexOf(ClassConstants.INTERNAL_TYPE_CLASS_START)+1,                                        internalClassType.length()-1) :            internalClassType;    }    /**     * Returns the internal class name of any given internal descriptor type,     * disregarding array prefixes.     * @param internalClassType the internal class type,     *                          e.g. "<code>Ljava/lang/Object;</code>" or     *                               "<code>[[I</code>".     * @return the internal class name,     *                          e.g. "<code>java/lang/Object</code>" or     *                               <code>null</code>.     */    public static String internalClassNameFromType(String internalClassType)    {        if (!isInternalClassType(internalClassType))        {            return null;        }        // Is it an array type?        if (isInternalArrayType(internalClassType))        {            internalClassType = internalTypeFromArrayType(internalClassType);        }        return internalClassNameFromClassType(internalClassType);    }    /**     * Returns the internal type of the given internal method descriptor.     * @param internalMethodDescriptor the internal method descriptor,     *                                 e.g. "<code>(II)Z</code>".     * @return the internal return type,     *                                 e.g. "<code>Z</code>".     */    public static String internalMethodReturnType(String internalMethodDescriptor)    {        int index = internalMethodDescriptor.indexOf(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE);        return internalMethodDescriptor.substring(index + 1);    }    /**     * Returns the number of parameters of the given internal method descriptor.     * @param internalMethodDescriptor the internal method descriptor,     *                                 e.g. "<code>(ID)Z</code>".     * @return the number of parameters,     *                                 e.g. 2.     */    public static int internalMethodParameterCount(String internalMethodDescriptor)    {        internalTypeEnumeration.setDescriptor(internalMethodDescriptor);        int counter = 0;        while (internalTypeEnumeration.hasMoreTypes())        {            internalTypeEnumeration.nextType();            counter++;        }        return counter;    }    /**     * Returns the size taken up on the stack by the parameters of the given     * internal method descriptor. This accounts for long and double parameters     * taking up two spaces.     * @param internalMethodDescriptor the internal method descriptor,     *                                 e.g. "<code>(ID)Z</code>".     * @return the size taken up on the stack,     *                                 e.g. 3.     */    public static int internalMethodParameterSize(String internalMethodDescriptor)    {        internalTypeEnumeration.setDescriptor(internalMethodDescriptor);        int size = 0;        while (internalTypeEnumeration.hasMoreTypes())        {            String internalType = internalTypeEnumeration.nextType();            size += internalTypeSize(internalType);        }        return size;    }    /**     * Returns the size taken up on the stack by the given internal type.     * The size is 1, except for long and double types, for which it is 2,     * and for the void type, for which 0 is returned     * @param internalType the internal type,     *                     e.g. "<code>I</code>".     * @return the size taken up on the stack,     *                     e.g. 1.     */    public static int internalTypeSize(String internalType)    {        if (internalType.length() == 1)        {            char internalPrimitiveType = internalType.charAt(0);            if      (internalPrimitiveType == ClassConstants.INTERNAL_TYPE_LONG ||                     internalPrimitiveType == ClassConstants.INTERNAL_TYPE_DOUBLE)            {                return 2;            }            else if (internalPrimitiveType == ClassConstants.INTERNAL_TYPE_VOID)            {                return 0;            }        }        return 1;    }    /**     * Converts an external type into an internal type.     * @param externalType the external type,     *                     e.g. "<code>java.lang.Object[][]</code>" or     *                          "<code>int[]</code>".     * @return the internal type,     *                     e.g. "<code>[[Ljava/lang/Object;</code>" or     *                          "<code>[I</code>".     */    public static String internalType(String externalType)    {        // Strip the array part, if any.        int dimensionCount = externalArrayTypeDimensionCount(externalType);        if (dimensionCount > 0)        {            externalType = externalType.substring(0, externalType.length() - dimensionCount * ClassConstants.EXTERNAL_TYPE_ARRAY.length());        }        // Analyze the actual type part.        char internalTypeChar =            externalType.equals(ClassConstants.EXTERNAL_TYPE_VOID   ) ?                                ClassConstants.INTERNAL_TYPE_VOID     :            externalType.equals(ClassConstants.EXTERNAL_TYPE_BOOLEAN) ?                                ClassConstants.INTERNAL_TYPE_BOOLEAN  :            externalType.equals(ClassConstants.EXTERNAL_TYPE_BYTE   ) ?                                ClassConstants.INTERNAL_TYPE_BYTE     :            externalType.equals(ClassConstants.EXTERNAL_TYPE_CHAR   ) ?                                ClassConstants.INTERNAL_TYPE_CHAR     :            externalType.equals(ClassConstants.EXTERNAL_TYPE_SHORT  ) ?                                ClassConstants.INTERNAL_TYPE_SHORT    :            externalType.equals(ClassConstants.EXTERNAL_TYPE_INT    ) ?                                ClassConstants.INTERNAL_TYPE_INT      :            externalType.equals(ClassConstants.EXTERNAL_TYPE_FLOAT  ) ?                                ClassConstants.INTERNAL_TYPE_FLOAT    :            externalType.equals(ClassConstants.EXTERNAL_TYPE_LONG   ) ?                                ClassConstants.INTERNAL_TYPE_LONG     :            externalType.equals(ClassConstants.EXTERNAL_TYPE_DOUBLE ) ?                                ClassConstants.INTERNAL_TYPE_DOUBLE   :            externalType.equals("%"                                 ) ?                                '%'                                   :                                (char)0;        String internalType =            internalTypeChar != 0 ? String.valueOf(internalTypeChar) :                                    ClassConstants.INTERNAL_TYPE_CLASS_START +                                    internalClassName(externalType) +                                    ClassConstants.INTERNAL_TYPE_CLASS_END;

⌨️ 快捷键说明

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