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

📄 classutil.java

📁 proguard 3.5 java 混淆器 最新 免费 好用的 大家用用试一下吧 天行健-君子以自强不息 地势坤-君子以厚德载物
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
    }    /**     * 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 ? ("" + internalTypeChar) :                                    (ClassConstants.INTERNAL_TYPE_CLASS_START +                                     internalClassName(externalType) +                                     ClassConstants.INTERNAL_TYPE_CLASS_END);        // 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 = 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;    }

⌨️ 快捷键说明

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