You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pekko.apache.org by he...@apache.org on 2026/06/23 05:04:29 UTC
(pekko) branch refactor/reflect-stackwalker created (now bfa367cdf9)
This is an automated email from the ASF dual-hosted git repository.
He-Pin pushed a change to branch refactor/reflect-stackwalker
in repository https://gitbox.apache.org/repos/asf/pekko.git
at bfa367cdf9 refactor: replace sun.reflect.Reflection with StackWalker in Reflect
This branch includes the following new commits:
new bfa367cdf9 refactor: replace sun.reflect.Reflection with StackWalker in Reflect
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org
(pekko) 01/01: refactor: replace sun.reflect.Reflection with StackWalker in Reflect
Posted by he...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
He-Pin pushed a commit to branch refactor/reflect-stackwalker
in repository https://gitbox.apache.org/repos/asf/pekko.git
commit bfa367cdf9182baf4f5ec91e21aa210fa18a0470
Author: 虎鸣 <he...@alibaba-inc.com>
AuthorDate: Tue Jun 23 13:04:20 2026 +0800
refactor: replace sun.reflect.Reflection with StackWalker in Reflect
Motivation:
Reflect.getCallerClass uses sun.reflect.Reflection.getCallerClass via
reflection, a JDK 8 internal API that was moved to
jdk.internal.reflect.Reflection in JDK 9+. On JDK 17+ without
--add-opens for jdk.internal.reflect, this always falls back to None.
Modification:
Replace with java.lang.StackWalker (JDK 9) with RETAIN_CLASS_REFERENCE
option, which is the official supported API for accessing caller
class information. The API contract is preserved: given a frame depth
index, returns the Class at that depth (or null if beyond stack).
Result:
Official JDK API instead of internal reflection hack. StackWalker
was already established in the codebase (LoggerClass.scala,
TestKitUtils.scala). The findClassLoader fallback now works reliably
on JDK 17+.
Tests:
sbt "actor/compile" — passed
References:
Refs #3136
---
actor/src/main/scala/org/apache/pekko/util/Reflect.scala | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/actor/src/main/scala/org/apache/pekko/util/Reflect.scala b/actor/src/main/scala/org/apache/pekko/util/Reflect.scala
index 14d7850590..5bca579dde 100644
--- a/actor/src/main/scala/org/apache/pekko/util/Reflect.scala
+++ b/actor/src/main/scala/org/apache/pekko/util/Reflect.scala
@@ -36,15 +36,17 @@ private[pekko] object Reflect {
* This optionally holds a function which looks N levels above itself
* on the call stack and returns the `Class[_]` object for the code
* executing in that stack frame. Implemented using
- * `sun.reflect.Reflection.getCallerClass` if available, None otherwise.
+ * `java.lang.StackWalker` (JDK 9+).
*
* Hint: when comparing to Thread.currentThread().getStackTrace, add two levels.
*/
val getCallerClass: Option[Int => Class[?]] = {
try {
- val c = Class.forName("sun.reflect.Reflection")
- val m = c.getMethod("getCallerClass", Array(classOf[Int]): _*)
- Some((i: Int) => m.invoke(null, Array[AnyRef](i.asInstanceOf[java.lang.Integer]): _*).asInstanceOf[Class[?]])
+ val walker = java.lang.StackWalker.getInstance(
+ java.util.Set.of(java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE))
+ Some((i: Int) =>
+ walker.walk((s: java.util.stream.Stream[java.lang.StackWalker.StackFrame]) =>
+ s.skip(i.toLong).map[Class[?]](_.getDeclaringClass).findFirst().orElse(null)))
} catch {
case NonFatal(_) => None
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org