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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2ed976009b HDDS-10121. GenericTestUtils.getFieldReflection fails with 
Java 17. (#6073)
2ed976009b is described below

commit 2ed976009be28b9a1c37011e6a3677d23cb9b7b4
Author: Devesh Kumar Singh <[email protected]>
AuthorDate: Wed Jan 24 18:15:19 2024 +0530

    HDDS-10121. GenericTestUtils.getFieldReflection fails with Java 17. (#6073)
---
 .../org/apache/ozone/test/GenericTestUtils.java    | 47 +++++++++++++++++++++-
 .../dist/src/shell/ozone/ozone-functions.sh        |  3 +-
 2 files changed, 47 insertions(+), 3 deletions(-)

diff --git 
a/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
index 92e059296c..79f0a09374 100644
--- 
a/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
+++ 
b/hadoop-hdds/test-utils/src/main/java/org/apache/ozone/test/GenericTestUtils.java
@@ -24,6 +24,8 @@ import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.time.Instant;
 import java.util.List;
 import java.util.Map;
@@ -226,7 +228,7 @@ public abstract class GenericTestUtils {
     boolean isAccessible = field.isAccessible();
 
     field.setAccessible(true);
-    Field modifiersField = Field.class.getDeclaredField("modifiers");
+    Field modifiersField = ReflectionUtils.getModifiersField();
     boolean modifierFieldAccessible = modifiersField.isAccessible();
     modifiersField.setAccessible(true);
     int modifierVal = modifiersField.getInt(field);
@@ -246,7 +248,7 @@ public abstract class GenericTestUtils {
     boolean isAccessible = field.isAccessible();
 
     field.setAccessible(true);
-    Field modifiersField = Field.class.getDeclaredField("modifiers");
+    Field modifiersField = ReflectionUtils.getModifiersField();
     boolean modifierFieldAccessible = modifiersField.isAccessible();
     modifiersField.setAccessible(true);
     int modifierVal = modifiersField.getInt(field);
@@ -468,4 +470,45 @@ public abstract class GenericTestUtils {
     }
   }
 
+  /**
+   * This class is a utility class for java reflection operations.
+   */
+  public static final class ReflectionUtils {
+
+    /**
+     * This method provides the modifiers field using reflection approach 
which is compatible
+     * for both pre Java 9 and post java 9 versions.
+     * @return modifiers field
+     * @throws IllegalAccessException
+     * @throws NoSuchFieldException
+     */
+    public static Field getModifiersField() throws IllegalAccessException, 
NoSuchFieldException {
+      Field modifiersField = null;
+      try {
+        modifiersField = Field.class.getDeclaredField("modifiers");
+      } catch (NoSuchFieldException e) {
+        try {
+          Method getDeclaredFields0 = Class.class.getDeclaredMethod(
+              "getDeclaredFields0", boolean.class);
+          boolean accessibleBeforeSet = getDeclaredFields0.isAccessible();
+          getDeclaredFields0.setAccessible(true);
+          Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, 
false);
+          getDeclaredFields0.setAccessible(accessibleBeforeSet);
+          for (Field field : fields) {
+            if ("modifiers".equals(field.getName())) {
+              modifiersField = field;
+              break;
+            }
+          }
+          if (modifiersField == null) {
+            throw e;
+          }
+        } catch (InvocationTargetException | NoSuchMethodException ex) {
+          e.addSuppressed(ex);
+          throw e;
+        }
+      }
+      return modifiersField;
+    }
+  }
 }
diff --git a/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh 
b/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh
index 392372bfc1..f9994438c2 100755
--- a/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh
+++ b/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh
@@ -1428,12 +1428,13 @@ function ozone_set_module_access_args
 
   # populate JVM args based on java version
   if [[ "${JAVA_MAJOR_VERSION}" -ge 17 ]]; then
-    OZONE_MODULE_ACCESS_ARGS="--add-opens java.base/java.lang=ALL-UNNAMED"
     OZONE_MODULE_ACCESS_ARGS="${OZONE_MODULE_ACCESS_ARGS} --add-opens 
java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED"
     OZONE_MODULE_ACCESS_ARGS="${OZONE_MODULE_ACCESS_ARGS} --add-exports 
java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED"
   fi
   if [[ "${JAVA_MAJOR_VERSION}" -ge 9 ]]; then
     OZONE_MODULE_ACCESS_ARGS="${OZONE_MODULE_ACCESS_ARGS} --add-opens 
java.base/java.nio=ALL-UNNAMED"
+    OZONE_MODULE_ACCESS_ARGS="${OZONE_MODULE_ACCESS_ARGS} --add-opens 
java.base/java.lang=ALL-UNNAMED"
+    OZONE_MODULE_ACCESS_ARGS="${OZONE_MODULE_ACCESS_ARGS} --add-opens 
java.base/java.lang.reflect=ALL-UNNAMED"
   fi
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to