String getMethodSignatureAsString(Class<?> returnType, Class<?>[] parameterTypes) { StringBuilder builder = new StringBuilder(); builder.append("("); for (Class<?> parameterType : parameterTypes) { builder.append(getAsmTypeAsString(parameterType, true)); } builder.append(")"); builder.append(getAsmTypeAsString(returnType, true)); return builder.toString(); }
/** * Gets the string to use for CHECKCAST instruction, returning the correct value for any type, including primitives and arrays * @param returnType The type to cast to with CHECKCAST * @return CHECKCAST parameter */ String getCastType(Class<?> returnType) { if (returnType.isPrimitive()) { return getWrapperType(returnType); } else { return getAsmTypeAsString(returnType, false); } }
/** * Converts a class to a String suitable for ASM. * @param parameterType Class to convert * @param wrap True if a non-array object should be wrapped with L and ; - e.g. Ljava/lang/Integer; * @return String to use for ASM */ public String getAsmTypeAsString(Class<?> parameterType, boolean wrap) { if (parameterType.isArray()) { if (parameterType.getComponentType().isPrimitive()) { Class<?> componentType = parameterType.getComponentType(); return "[" + getPrimitiveLetter(componentType); } else { return "[" + getAsmTypeAsString(parameterType.getComponentType(), true); } } else { if (! parameterType.isPrimitive()) { if (wrap) { return "L" + parameterType.getCanonicalName().replaceAll("\\.", "/") + ";"; } else { return parameterType.getCanonicalName().replaceAll("\\.", "/"); } } else { return getPrimitiveLetter(parameterType); } } }
mv.visitFieldInsn(GETSTATIC, wrapperType, "TYPE", "Ljava/lang/Class;"); } else { mv.visitLdcInsn(Type.getType(getAsmTypeAsString(parameterType, true)));