This is an automated email from the ASF dual-hosted git repository. Abacn pushed a commit to branch fix-reflect in repository https://gitbox.apache.org/repos/asf/beam.git
commit 4ac37eb0d61877d79dda7cded86f36002302d914 Author: Yi Hu <[email protected]> AuthorDate: Tue Jul 14 14:37:32 2026 -0400 Attempt to fix DataflowV1 test failure by fixing getSimpleName access --- .../beam/sdk/transforms/display/DisplayData.java | 7 ++++--- .../beam/sdk/transforms/reflect/DoFnSignatures.java | 3 ++- .../apache/beam/sdk/util/common/ReflectHelpers.java | 19 +++++++++++++++++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java index 3be59e55615..dcc84ad8e1a 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/display/DisplayData.java @@ -33,6 +33,7 @@ import java.util.Objects; import java.util.Set; import org.apache.beam.sdk.options.ValueProvider; import org.apache.beam.sdk.transforms.PTransform; +import org.apache.beam.sdk.util.common.ReflectHelpers; import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Joiner; import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableList; import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect.ImmutableMap; @@ -617,7 +618,7 @@ public class DisplayData implements Serializable { @Override FormattedItemValue format(Object value) { Class<?> clazz = checkType(value, Class.class, JAVA_CLASS); - return new FormattedItemValue(clazz.getName(), clazz.getSimpleName()); + return new FormattedItemValue(clazz.getName(), ReflectHelpers.getSimpleName(clazz)); } }; @@ -753,10 +754,10 @@ public class DisplayData implements Serializable { // Common case: AutoValue classes such as AutoValue_FooIO_Read. It's more useful // to show the user the FooIO.Read class, which is the direct superclass of the AutoValue // generated class. - if (namespace.getSimpleName().startsWith("AutoValue_")) { + if (ReflectHelpers.getSimpleName(namespace).startsWith("AutoValue_")) { namespace = namespace.getSuperclass(); } - if (namespace.isSynthetic() && namespace.getSimpleName().contains("$$Lambda")) { + if (namespace.isSynthetic() && ReflectHelpers.getSimpleName(namespace).contains("$$Lambda")) { try { String className = namespace.getCanonicalName(); // A local class, local interface, or anonymous class does not have a canonical name. diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java index 9f3491bca7b..6d28f934386 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/reflect/DoFnSignatures.java @@ -2421,7 +2421,8 @@ public class DoFnSignatures { } private static String format(Class<?> kls) { - return kls.getSimpleName().isEmpty() ? kls.getName() : kls.getSimpleName(); + String simpleName = ReflectHelpers.getSimpleName(kls); + return simpleName.isEmpty() ? kls.getName() : simpleName; } static class ErrorReporter { diff --git a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java index c2d945bbaac..0da32ab6b4c 100644 --- a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java +++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/common/ReflectHelpers.java @@ -52,11 +52,26 @@ public class ReflectHelpers { private static final Joiner COMMA_SEPARATOR = Joiner.on(", "); + /** + * Returns the simple name of the given class, or a fallback simple name derived from the class + * name if {@link Class#getSimpleName()} throws an exception (such as an {@link + * IllegalAccessError} on Java 17+ for non-public inner classes). + */ + public static String getSimpleName(Class<?> clazz) { + try { + return clazz.getSimpleName(); + } catch (Throwable t) { + String name = clazz.getName(); + int idx = Math.max(name.lastIndexOf('.'), name.lastIndexOf('$')); + return idx != -1 ? name.substring(idx + 1) : name; + } + } + /** Returns a string representation of the signature of a {@link Method}. */ public static String formatMethod(Method input) { String parameterTypes = FluentIterable.from(asList(input.getParameterTypes())) - .transform(Class::getSimpleName) + .transform(ReflectHelpers::getSimpleName) .join(COMMA_SEPARATOR); return String.format("%s(%s)", input.getName(), parameterTypes); } @@ -100,7 +115,7 @@ public class ReflectHelpers { } private static void formatClass(StringBuilder builder, Class<?> clazz) { - builder.append(clazz.getSimpleName()); + builder.append(getSimpleName(clazz)); } private static void formatTypeVariable(StringBuilder builder, TypeVariable<?> t) {
