This is an automated email from the ASF dual-hosted git repository.

Abacn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/master by this push:
     new 37cac0603bc Fix DataflowV1 test failure by fixing getSimpleName access 
(#39330)
37cac0603bc is described below

commit 37cac0603bc69b5a9c4f643a0a6ea842fc9f0096
Author: Yi Hu <[email protected]>
AuthorDate: Wed Jul 15 08:02:11 2026 -0400

    Fix DataflowV1 test failure by fixing getSimpleName access (#39330)
---
 .../beam_PostCommit_Java_DataflowV1.json           |  2 +-
 .../beam/sdk/transforms/display/DisplayData.java   |  7 ++++---
 .../sdk/transforms/reflect/DoFnSignatures.java     |  3 ++-
 .../beam/sdk/util/common/ReflectHelpers.java       | 22 ++++++++++++++++++++--
 4 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json 
b/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json
index ae6cb268ff6..aff502e1962 100644
--- a/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json
+++ b/.github/trigger_files/beam_PostCommit_Java_DataflowV1.json
@@ -1,5 +1,5 @@
 {
-  "https://github.com/apache/beam/pull/36138": "Cleanly separating v1 worker 
and v2 sdk harness container image handling",
+  "https://github.com/apache/beam/pull/39330": "Fix DataflowV1 test failure by 
fixing getSimpleName access",
   "https://github.com/apache/beam/pull/34902": "Introducing OutputBuilder",
   "https://github.com/apache/beam/pull/35177": "Introducing 
WindowedValueReceiver to runners",
     "comment": "Modify this file in a trivial way to cause this test suite to 
run",
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..7d5964cb83c 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,29 @@ 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) {
+      if (clazz.isArray()) {
+        return getSimpleName(clazz.getComponentType()) + "[]";
+      }
+      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 +118,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) {

Reply via email to