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