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

Reply via email to