From a67152575959dc3280539c39da03a6fcdfaa60d3 Mon Sep 17 00:00:00 2001 From: Sergey Tsypanov Date: Tue, 7 Jun 2022 16:11:15 +0300 Subject: [PATCH 1/2] 8287908: Use non-cloning reflection methods where acceptable --- .../share/classes/java/lang/reflect/Executable.java | 4 ++-- .../share/classes/java/lang/reflect/Parameter.java | 4 ++-- src/java.base/share/classes/java/lang/reflect/Proxy.java | 2 +- .../share/classes/java/lang/reflect/ProxyGenerator.java | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/java.base/share/classes/java/lang/reflect/Executable.java b/src/java.base/share/classes/java/lang/reflect/Executable.java index d86a454c75116..20247ab7484aa 100644 --- a/src/java.base/share/classes/java/lang/reflect/Executable.java +++ b/src/java.base/share/classes/java/lang/reflect/Executable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -315,7 +315,7 @@ Type[] getAllGenericParameterTypes() { } else { final boolean realParamData = hasRealParameterData(); final Type[] genericParamTypes = getGenericParameterTypes(); - final Type[] nonGenericParamTypes = getParameterTypes(); + final Type[] nonGenericParamTypes = getSharedParameterTypes(); // If we have real parameter data, then we use the // synthetic and mandate flags to our advantage. if (realParamData) { diff --git a/src/java.base/share/classes/java/lang/reflect/Parameter.java b/src/java.base/share/classes/java/lang/reflect/Parameter.java index 780319585ab2b..d6a1bef01013e 100644 --- a/src/java.base/share/classes/java/lang/reflect/Parameter.java +++ b/src/java.base/share/classes/java/lang/reflect/Parameter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -219,7 +219,7 @@ public Type getParameterizedType() { public Class getType() { Class tmp = parameterClassCache; if (null == tmp) { - tmp = executable.getParameterTypes()[index]; + tmp = executable.getSharedParameterTypes()[index]; parameterClassCache = tmp; } return tmp; diff --git a/src/java.base/share/classes/java/lang/reflect/Proxy.java b/src/java.base/share/classes/java/lang/reflect/Proxy.java index eddaf73936124..060a17eb93459 100644 --- a/src/java.base/share/classes/java/lang/reflect/Proxy.java +++ b/src/java.base/share/classes/java/lang/reflect/Proxy.java @@ -1259,7 +1259,7 @@ private static Class findProxyInterfaceOrElseThrow(Class proxyClass, Metho // check if this method is the resolved method if referenced from // this proxy interface (i.e. this method is not implemented // by any other superinterface) - Method m = proxyIntf.getMethod(method.getName(), method.getParameterTypes()); + Method m = proxyIntf.getMethod(method.getName(), method.getSharedParameterTypes()); if (m.getDeclaringClass() == declaringClass) { return proxyIntf; } diff --git a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java index 0c0b76bec8e3e..dd2fef7f8aa82 100644 --- a/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java +++ b/src/java.base/share/classes/java/lang/reflect/ProxyGenerator.java @@ -522,7 +522,7 @@ private byte[] generateClassFile() { */ private void addProxyMethod(Method m, Class fromClass) { Class returnType = m.getReturnType(); - Class[] exceptionTypes = m.getExceptionTypes(); + Class[] exceptionTypes = m.getSharedExceptionTypes(); String sig = m.toShortSignature(); List sigmethods = proxyMethods.computeIfAbsent(sig, @@ -544,7 +544,7 @@ private void addProxyMethod(Method m, Class fromClass) { return; } } - sigmethods.add(new ProxyMethod(m, sig, m.getParameterTypes(), returnType, + sigmethods.add(new ProxyMethod(m, sig, m.getSharedParameterTypes(), returnType, exceptionTypes, fromClass, "m" + proxyMethodCount++)); } @@ -717,8 +717,8 @@ private ProxyMethod(Method method, String sig, Class[] parameterTypes, */ private ProxyMethod(Method method, String methodFieldName) { this(method, method.toShortSignature(), - method.getParameterTypes(), method.getReturnType(), - method.getExceptionTypes(), method.getDeclaringClass(), methodFieldName); + method.getSharedParameterTypes(), method.getReturnType(), + method.getSharedExceptionTypes(), method.getDeclaringClass(), methodFieldName); } /** From 7ef88f83b383d51ae84ebc55ac7c3a179783dc89 Mon Sep 17 00:00:00 2001 From: Sergey Tsypanov Date: Tue, 14 Jun 2022 22:33:14 +0300 Subject: [PATCH 2/2] 8287908: Make Executable.getAllGenericParameterTypes() safe --- .../share/classes/java/lang/reflect/Executable.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/lang/reflect/Executable.java b/src/java.base/share/classes/java/lang/reflect/Executable.java index 20247ab7484aa..ca87066b4b95e 100644 --- a/src/java.base/share/classes/java/lang/reflect/Executable.java +++ b/src/java.base/share/classes/java/lang/reflect/Executable.java @@ -25,12 +25,11 @@ package java.lang.reflect; -import java.lang.annotation.*; +import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.Map; import java.util.Objects; import java.util.StringJoiner; -import java.util.stream.Stream; import java.util.stream.Collectors; import jdk.internal.access.SharedSecrets; @@ -342,7 +341,7 @@ Type[] getAllGenericParameterTypes() { // synthetic/mandated, thus, no way to match up the // indexes. return genericParamTypes.length == nonGenericParamTypes.length ? - genericParamTypes : nonGenericParamTypes; + genericParamTypes : getParameterTypes(); } } }