📄 classutil.java
字号:
} /** * 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 + -