Ja, Sie können, mit Reflexion. Jedoch müssen Sie nicht. Aus genau den Gründen, auf die andere hingewiesen haben: Sie sind verpflichtet, Dinge zu brechen oder unerwartete Ergebnisse zu erzielen.
Aber rein für die akademische Demonstration, dass es möglich ist, diese Methode tut, was Sie fragen:
@NotThreadSafe
Object getValueForThread(ThreadLocal<?> threadLocal, Thread thread) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
Method getMap = ThreadLocal.class.getDeclaredMethod("getMap", new Class<?>[]{Thread.class});
getMap.setAccessible(true);
Object map = getMap.invoke(threadLocal, thread);
Class<?> clazz = map.getClass();
Method getEntry = clazz.getDeclaredMethod("getEntry", new Class<?>[]{ThreadLocal.class});
getEntry.setAccessible(true);
Object entry = getEntry.invoke(map, threadLocal);
Field value = entry.getClass().getDeclaredField("value");
value.setAccessible(true);
return value.get(entry);
}
Oder zumindest kann es tun, was Sie fragen. Da es keine Sichtbarkeitsgarantien gibt, kann der Thread, der diese Methode aufruft, veraltete Werte sehen. Also noch einmal: tue das nicht.
Nein. Es würde die Bedeutung von "thread-local" verletzen. Wenn Sie nicht möchten, dass es Thread-lokal ist, verwenden Sie nicht 'ThreadLocal' dafür. – EJP
Setzen Sie die Variable in die Elternklasse –
Es ist in einer anderen Third-Party-Bibliothek, ich kann das nicht ändern. :( – zjffdu