From 882804ba0f5d942ae7391e97cc26cd735047e0ec Mon Sep 17 00:00:00 2001 From: ggggght Date: Wed, 5 Oct 2022 17:13:57 +0800 Subject: [PATCH 1/5] fix: When getting the fields in the class, the parent class is not looked up https://github.com/btraceio/btrace/issues/565 --- .../org/openjdk/btrace/core/BTraceUtils.java | 16 +++++++++++++++ .../openjdk/btrace/core/BTraceUtilsTest.java | 20 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java diff --git a/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java b/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java index b6ee3a2cc..db89567ce 100644 --- a/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java +++ b/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java @@ -40,6 +40,7 @@ import java.util.Deque; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -3040,6 +3041,21 @@ private static Field getField(Class clazz, String name, boolean throwError) { field.setAccessible(true); return field; } catch (Exception exp) { + if(exp instanceof NoSuchFieldException) { + Class superClass = clazz.getSuperclass(); + Field field = null; + while (Objects.isNull(field) && Objects.nonNull(superClass)) { + try { + field = superClass.getDeclaredField(name); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + if (Objects.nonNull(field)) { + field.setAccessible(true); + return field; + } + } if (throwError) { throw translate(exp); } else { diff --git a/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java b/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java new file mode 100644 index 000000000..257acbe29 --- /dev/null +++ b/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java @@ -0,0 +1,20 @@ +package org.openjdk.btrace.core; + +import org.junit.jupiter.api.Test; + + +class BTraceUtilsTest { + + static class SuperClass { + int a; + } + + static class Subclass extends SuperClass { + + } + @Test + public void getIntTest() { + Subclass a = new Subclass(); + assert BTraceUtils.Reflective.getInt("a", a) == 0; + } +} \ No newline at end of file From 63935db1fb1b864c5008b8c7e74185315e55023f Mon Sep 17 00:00:00 2001 From: ggggght Date: Thu, 6 Oct 2022 23:03:48 +0800 Subject: [PATCH 2/5] fix: Modify the problem that can only find two levels https://github.com/btraceio/btrace/issues/565 --- .../src/main/java/org/openjdk/btrace/core/BTraceUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java b/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java index db89567ce..ef6c0d84d 100644 --- a/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java +++ b/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java @@ -3048,7 +3048,7 @@ private static Field getField(Class clazz, String name, boolean throwError) { try { field = superClass.getDeclaredField(name); } catch (NoSuchFieldException e) { - throw new RuntimeException(e); + // Ignore exception and keep looking up } } if (Objects.nonNull(field)) { From 12c480585869d46dc98b7371209173901b0e9c69 Mon Sep 17 00:00:00 2001 From: ggggght Date: Sun, 9 Oct 2022 11:05:36 +0800 Subject: [PATCH 3/5] fix: Fix master branch logic,add new test case https://github.com/btraceio/btrace/issues/565 --- .../org/openjdk/btrace/core/BTraceUtils.java | 32 +++++++++---------- .../openjdk/btrace/core/BTraceUtilsTest.java | 22 +++++++++---- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java b/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java index ef6c0d84d..a18516645 100644 --- a/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java +++ b/btrace-core/src/main/java/org/openjdk/btrace/core/BTraceUtils.java @@ -3036,26 +3036,26 @@ private static Field getField(Class clazz, String name, boolean throwError) { return AccessController.doPrivileged( (PrivilegedAction) () -> { + Field field = null; + Class cClass = clazz; try { - Field field = clazz.getDeclaredField(name); + while (Objects.isNull(field) && Objects.nonNull(cClass)) { + try { + field = cClass.getDeclaredField(name); + } catch (NoSuchFieldException exp) { + // Ignore the exception and continue looking for the parent class + cClass = cClass.getSuperclass(); + } + } + + if (Objects.isNull(cClass)) { + throw new NoSuchFieldException(name); + } + field.setAccessible(true); + return field; } catch (Exception exp) { - if(exp instanceof NoSuchFieldException) { - Class superClass = clazz.getSuperclass(); - Field field = null; - while (Objects.isNull(field) && Objects.nonNull(superClass)) { - try { - field = superClass.getDeclaredField(name); - } catch (NoSuchFieldException e) { - // Ignore exception and keep looking up - } - } - if (Objects.nonNull(field)) { - field.setAccessible(true); - return field; - } - } if (throwError) { throw translate(exp); } else { diff --git a/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java b/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java index 257acbe29..85bfe2d81 100644 --- a/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java +++ b/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java @@ -2,19 +2,29 @@ import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class BTraceUtilsTest { - static class SuperClass { + @Test + public void getIntTest() { + D a = new D(); + RuntimeException exception = assertThrows(RuntimeException.class, () -> BTraceUtils.Reflective.getInt("notExist", a)); + assertTrue(exception.getMessage().contains("notExist")); + } + + static class A { int a; } - static class Subclass extends SuperClass { + static class B extends A { } - @Test - public void getIntTest() { - Subclass a = new Subclass(); - assert BTraceUtils.Reflective.getInt("a", a) == 0; + + static class C extends A { + } + + static class D extends C { } } \ No newline at end of file From a55324b084c515fb4e4b4bc00b9ea3dcbf3beb4d Mon Sep 17 00:00:00 2001 From: GGGGGHT Date: Mon, 10 Oct 2022 09:37:26 +0800 Subject: [PATCH 4/5] Apply suggestions from code review Co-authored-by: Jaroslav Bachorik --- .../src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java b/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java index 85bfe2d81..2754e4e5c 100644 --- a/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java +++ b/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java @@ -5,7 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -class BTraceUtilsTest { +class ReflectiveFieldAccessTest { @Test public void getIntTest() { From fd567d3bf25820523dc5394f31967145c7203dcc Mon Sep 17 00:00:00 2001 From: ggggght Date: Wed, 12 Oct 2022 09:52:10 +0800 Subject: [PATCH 5/5] rename file https://github.com/btraceio/btrace/issues/565 --- .../core/{BTraceUtilsTest.java => ReflectiveFieldAccessTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename btrace-core/src/test/java/org/openjdk/btrace/core/{BTraceUtilsTest.java => ReflectiveFieldAccessTest.java} (100%) diff --git a/btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java b/btrace-core/src/test/java/org/openjdk/btrace/core/ReflectiveFieldAccessTest.java similarity index 100% rename from btrace-core/src/test/java/org/openjdk/btrace/core/BTraceUtilsTest.java rename to btrace-core/src/test/java/org/openjdk/btrace/core/ReflectiveFieldAccessTest.java