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 + -
显示快捷键?