package org.junit.internal.management; import org.junit.internal.Classes; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Implementation of {@link ThreadMXBean} using the JVM reflectively. */ final class ReflectiveThreadMXBean implements ThreadMXBean { private final Object threadMxBean; private static final class Holder { static final Method getThreadCpuTimeMethod; static final Method isThreadCpuTimeSupportedMethod; private static final String FAILURE_MESSAGE = "Unable to access ThreadMXBean"; static { Method threadCpuTime = null; Method threadCpuTimeSupported = null; try { Class<?> threadMXBeanClass = Classes.getClass("java.lang.management.ThreadMXBean"); threadCpuTime = threadMXBeanClass.getMethod("getThreadCpuTime", long.class); threadCpuTimeSupported = threadMXBeanClass.getMethod("isThreadCpuTimeSupported"); } catch (ClassNotFoundException e) { // do nothing, the methods will be null on failure } catch (NoSuchMethodException e) { // do nothing, the methods will be null on failure } catch (SecurityException e) { // do nothing, the methods will be null on failure } getThreadCpuTimeMethod = threadCpuTime; isThreadCpuTimeSupportedMethod = threadCpuTimeSupported; } } ReflectiveThreadMXBean(Object threadMxBean) { super(); this.threadMxBean = threadMxBean; } /** * {@inheritDoc} */ public long getThreadCpuTime(long id) { if (Holder.getThreadCpuTimeMethod != null) { Exception error = null; try { return (Long) Holder.getThreadCpuTimeMethod.invoke(threadMxBean, id); } catch (ClassCastException e) { error = e; // fallthrough } catch (IllegalAccessException e) { error = e; // fallthrough } catch (IllegalArgumentException e) { error = e; // fallthrough } catch (InvocationTargetException e) { error = e; // fallthrough } throw new UnsupportedOperationException(Holder.FAILURE_MESSAGE, error); } throw new UnsupportedOperationException(Holder.FAILURE_MESSAGE); } /** * {@inheritDoc} */ public boolean isThreadCpuTimeSupported() { if (Holder.isThreadCpuTimeSupportedMethod != null) { try { return (Boolean) Holder.isThreadCpuTimeSupportedMethod.invoke(threadMxBean); } catch (ClassCastException e) { // fallthrough } catch (IllegalAccessException e) { // fallthrough } catch (IllegalArgumentException e) { // fallthrough } catch (InvocationTargetException e) { // fallthrough } } return false; } }