ThreadLocalMirror.java
package eu.javaexperience.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ThreadLocalMirror
{
private static final Method TLTLMgetEntry = Mirror.getClassMethodOrNull("java.lang.ThreadLocal$ThreadLocalMap","getEntry", ThreadLocal.class);
private static final Field Thread_threadLocals = Mirror.getClassFieldOrNull(Thread.class, "threadLocals");
private static final Field TLTLME = Mirror.getClassFieldOrNull("java.lang.ThreadLocal$ThreadLocalMap$Entry", "value");
public static <T> T getOtherThreadsLocalVariable(ThreadLocal<T> threadLocal,Thread t) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
//System.out.println(TLTLMgetEntry+" "+Thread_threadLocals+" "+TLTLME);
Object o = Thread_threadLocals.get(t);
if(o == null)
return null;
o = TLTLMgetEntry.invoke(o, threadLocal);
if(o == null)
return null;
return (T) TLTLME.get(o);
}
}