/* ThreadLocals.java {{IS_NOTE Purpose: Description: History: Thu Sep 21 10:07:46 2006, Created by henrichen }}IS_NOTE Copyright (C) 2006 Potix Corporation. All Rights Reserved. {{IS_RIGHT }}IS_RIGHT */ package org.zkoss.zkplus.util; import java.lang.reflect.Field; import org.zkoss.lang.Classes; import org.zkoss.lang.SystemException; import org.zkoss.lang.reflect.Fields; /** * ThreadLocal related utilities. * * @author henrichen * @since 3.0.6 */ public class ThreadLocals { /** Given class name and static ThreadLocal field name, return the associated ThreadLocal. * @param clsname the class name * @param fldname the ThreadLocal field name */ public static ThreadLocal getThreadLocal(String clsname, String fldname) { try { Class cls = Classes.forNameByThread(clsname); return getThreadLocal(cls, fldname); } catch (ClassNotFoundException ex) { throw SystemException.Aide.wrap(ex); } } /** Given class and static ThreadLocal field name, return the associated ThreadLocal. * @param cls the class * @param fldname the ThreadLocal field name. */ public static ThreadLocal getThreadLocal(Class cls, String fldname) { Field fld = null; boolean acs = false; try { fld = cls.getDeclaredField(fldname); acs = fld.isAccessible(); fld.setAccessible(true); return (ThreadLocal) fld.get(cls); //class static field, a ThreadLocal } catch (java.lang.NoSuchFieldException ex) { throw SystemException.Aide.wrap(ex); } catch (java.lang.IllegalAccessException ex) { throw SystemException.Aide.wrap(ex); } finally { if (fld != null) Fields.setAccessible(fld, acs); //restore } } }