< 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 >