< prev index next >

src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java

Print this page

        

*** 28,38 **** import java.io.ObjectInputStream; import java.lang.annotation.*; import java.lang.reflect.*; import java.io.Serializable; import java.util.*; ! import java.util.stream.Collectors; import java.security.AccessController; import java.security.PrivilegedAction; /** * InvocationHandler for dynamic proxy implementation of Annotation. --- 28,38 ---- import java.io.ObjectInputStream; import java.lang.annotation.*; import java.lang.reflect.*; import java.io.Serializable; import java.util.*; ! import java.util.stream.*; import java.security.AccessController; import java.security.PrivilegedAction; /** * InvocationHandler for dynamic proxy implementation of Annotation.
*** 161,211 **** /** * Translates a member value (in "dynamic proxy return form") into a string. */ private static String memberValueToString(Object value) { Class<?> type = value.getClass(); ! if (!type.isArray()) { // primitive, string, class, enum const, ! // or annotation if (type == Class.class) ! return classValueToString((Class<?>) value); else return value.toString(); ! } ! if (type == byte[].class) ! return Arrays.toString((byte[]) value); ! if (type == char[].class) ! return Arrays.toString((char[]) value); ! if (type == double[].class) ! return Arrays.toString((double[]) value); ! if (type == float[].class) ! return Arrays.toString((float[]) value); ! if (type == int[].class) ! return Arrays.toString((int[]) value); ! if (type == long[].class) ! return Arrays.toString((long[]) value); ! if (type == short[].class) ! return Arrays.toString((short[]) value); ! if (type == boolean[].class) ! return Arrays.toString((boolean[]) value); ! if (type == Class[].class) ! return classArrayValueToString((Class<?>[])value); ! return Arrays.toString((Object[]) value); } /** * Translates a Class value to a form suitable for use in the * string representation of an annotation. */ ! private static String classValueToString(Class<?> clazz) { ! return clazz.getName() + ".class" ; } ! private static String classArrayValueToString(Class<?>[] classes) { ! return Arrays.stream(classes) ! .map(AnnotationInvocationHandler::classValueToString) ! .collect(Collectors.joining(", ", "{", "}")); } /** * Implementation of dynamicProxy.equals(Object o) */ --- 161,331 ---- /** * Translates a member value (in "dynamic proxy return form") into a string. */ private static String memberValueToString(Object value) { Class<?> type = value.getClass(); ! if (!type.isArray()) { ! // primitive value, string, class, enum const, or annotation if (type == Class.class) ! return toSourceString((Class<?>) value); ! else if (type == String.class) ! return toSourceString((String) value); ! if (type == Character.class) ! return toSourceString((char) value); ! else if (type == Double.class) ! return toSourceString((double) value); ! else if (type == Float.class) ! return toSourceString((float) value); ! else if (type == Long.class) ! return toSourceString((long) value); else return value.toString(); ! } else { ! Stream<String> stringStream; if (type == byte[].class) ! stringStream = convert((byte[]) value); ! else if (type == char[].class) ! stringStream = convert((char[]) value); ! else if (type == double[].class) ! stringStream = DoubleStream.of((double[]) value) ! .mapToObj(AnnotationInvocationHandler::toSourceString); ! else if (type == float[].class) ! stringStream = convert((float[]) value); ! else if (type == int[].class) ! stringStream = IntStream.of((int[]) value).mapToObj(String::valueOf); ! else if (type == long[].class) { ! stringStream = LongStream.of((long[]) value) ! .mapToObj(AnnotationInvocationHandler::toSourceString); ! } else if (type == short[].class) ! stringStream = convert((short[]) value); ! else if (type == boolean[].class) ! stringStream = convert((boolean[]) value); ! else if (type == Class[].class) ! stringStream = ! Arrays.stream((Class<?>[]) value). ! map(AnnotationInvocationHandler::toSourceString); ! else if (type == String[].class) ! stringStream = ! Arrays.stream((String[])value). ! map(AnnotationInvocationHandler::toSourceString); ! else ! stringStream = Arrays.stream((Object[])value).map(Objects::toString); ! ! return stringStreamToString(stringStream); ! } } /** * Translates a Class value to a form suitable for use in the * string representation of an annotation. */ ! private static String toSourceString(Class<?> clazz) { ! Class<?> finalComponent = clazz; ! StringBuilder arrayBackets = new StringBuilder(); ! ! while(finalComponent.isArray()) { ! finalComponent = finalComponent.getComponentType(); ! arrayBackets.append("[]"); ! } ! ! return finalComponent.getName() + arrayBackets.toString() + ".class" ; ! } ! ! private static String toSourceString(float f) { ! if (Float.isFinite(f)) ! return Float.toString(f) + "f" ; ! else { ! if (Float.isInfinite(f)) { ! return (f < 0.0f) ? "-1.0f/0.0f": "1.0f/0.0f"; ! } else ! return "0.0f/0.0f"; ! } ! } ! ! private static String toSourceString(double d) { ! if (Double.isFinite(d)) ! return Double.toString(d); ! else { ! if (Double.isInfinite(d)) { ! return (d < 0.0f) ? "-1.0/0.0": "1.0/0.0"; ! } else ! return "0.0/0.0"; ! } ! } ! ! private static String toSourceString(char c) { ! StringBuilder sb = new StringBuilder(); ! sb.append("'"); ! if (c == '\'') ! sb.append("\\'"); ! else ! sb.append(c); ! sb.append("'"); ! return sb.toString(); ! } ! ! private static String toSourceString(long ell) { ! return (Math.abs(ell) <= Integer.MAX_VALUE) ? ! String.valueOf(ell) : ! (String.valueOf(ell) + "L"); ! } ! ! /** ! * Return a string suitable for use in the string representation ! * of an annotation. ! */ ! private static String toSourceString(String s) { ! StringBuilder sb = new StringBuilder(); ! sb.append('"'); ! // Escape embedded quote characters, if present, but don't do ! // anything more heroic. ! if (s.indexOf('"') != -1) { ! s = s.replace("\"", "\\\""); ! } ! sb.append(s); ! sb.append('"'); ! return sb.toString(); ! } ! ! private static Stream<String> convert(byte[] values) { ! List<String> list = new ArrayList<>(values.length); ! for (byte b : values) ! list.add(Byte.toString(b)); ! return list.stream(); ! } ! ! private static Stream<String> convert(char[] values) { ! List<String> list = new ArrayList<>(values.length); ! for (char c : values) ! list.add(toSourceString(c)); ! return list.stream(); ! } ! ! private static Stream<String> convert(float[] values) { ! List<String> list = new ArrayList<>(values.length); ! for (float f : values) { ! list.add(toSourceString(f)); ! } ! return list.stream(); ! } ! ! private static Stream<String> convert(short[] values) { ! List<String> list = new ArrayList<>(values.length); ! for (short s : values) ! list.add(Short.toString(s)); ! return list.stream(); ! } ! ! private static Stream<String> convert(boolean[] values) { ! List<String> list = new ArrayList<>(values.length); ! for (boolean b : values) ! list.add(Boolean.toString(b)); ! return list.stream(); } ! private static String stringStreamToString(Stream<String> stream) { ! return stream.collect(Collectors.joining(", ", "{", "}")); } /** * Implementation of dynamicProxy.equals(Object o) */
< prev index next >