aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/Thread.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/lang/Thread.java')
-rw-r--r--libjava/java/lang/Thread.java45
1 files changed, 41 insertions, 4 deletions
diff --git a/libjava/java/lang/Thread.java b/libjava/java/lang/Thread.java
index 7216512..84682f3 100644
--- a/libjava/java/lang/Thread.java
+++ b/libjava/java/lang/Thread.java
@@ -50,6 +50,9 @@ import java.lang.management.ThreadMXBean;
import java.util.HashMap;
import java.util.Map;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
@@ -1291,9 +1294,43 @@ public class Thread implements Runnable
SecurityManager sm = SecurityManager.current; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("getStackTrace"));
- ThreadMXBean bean = ManagementFactory.getThreadMXBean();
- ThreadInfo info = bean.getThreadInfo(getId(), Integer.MAX_VALUE);
- return info.getStackTrace();
- }
+ // Calling java.lang.management via reflection means that
+ // javax.management be overridden in the endorsed directory.
+
+ // This is the equivalent code:
+ //
+ // ThreadMXBean bean = ManagementFactory.getThreadMXBean();
+ // ThreadInfo info = bean.getThreadInfo(getId(), Integer.MAX_VALUE);
+ // return info.getStackTrace();
+
+ try
+ {
+ try
+ {
+ Object bean
+ = (Class.forName("java.lang.management.ManagementFactory")
+ .getDeclaredMethod("getThreadMXBean")
+ .invoke(null));
+ Object info = bean.getClass()
+ .getDeclaredMethod("getThreadInfo", long.class, int.class)
+ .invoke(bean, new Long(getId()), new Integer(Integer.MAX_VALUE));
+ Object trace = info.getClass()
+ .getDeclaredMethod("getStackTrace").invoke(info);
+ return (StackTraceElement[])trace;
+ }
+ catch (InvocationTargetException e)
+ {
+ throw (Exception)e.getTargetException();
+ }
+ }
+ catch (UnsupportedOperationException e)
+ {
+ throw e;
+ }
+ catch (Exception e)
+ {
+ throw new UnsupportedOperationException(e);
+ }
+ }
}