1 package org.apache.log4j; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Method; 5 6 import org.apache.log4j.helpers.ThreadLocalMap; 7 8 public class MDCFriend { 9 10 public static void fixForJava9() { 11 try { 12 Field mdcField = MDC.class.getDeclaredField("mdc"); 13 14 MDC mdcSingleton = (MDC) mdcField.get(null); 15 Field tlmField = MDC.class.getDeclaredField("tlm"); 16 17 Field java1Field = MDC.class.getDeclaredField("java1"); 18 Object mdcSingleton_tlm = tlmField.get(mdcSingleton); 19 20 if (mdcSingleton_tlm == null) { 21 tlmField.set(mdcSingleton, new ThreadLocalMap()); 22 java1Field.setBoolean(mdcSingleton, false); 23 setRemoveMethod(mdcSingleton); 24 } 25 } catch (SecurityException e) { 26 e.printStackTrace(); 27 } catch (NoSuchFieldException e) { 28 e.printStackTrace(); 29 } catch (IllegalArgumentException e) { 30 e.printStackTrace(); 31 } catch (IllegalAccessException e) { 32 e.printStackTrace(); 33 } 34 35 } 36 37 private static void setRemoveMethod(org.apache.log4j.MDC mdc) { 38 try { 39 Method removeMethod = ThreadLocal.class.getMethod("remove"); 40 Field removeMethodField = MDC.class.getDeclaredField("removeMethod"); 41 removeMethodField.setAccessible(true); 42 removeMethodField.set(mdc, removeMethod); 43 } catch (NoSuchMethodException e) { 44 e.printStackTrace(); 45 } catch (SecurityException e) { 46 e.printStackTrace(); 47 } catch (NoSuchFieldException e) { 48 e.printStackTrace(); 49 } catch (IllegalArgumentException e) { 50 e.printStackTrace(); 51 } catch (IllegalAccessException e) { 52 e.printStackTrace(); 53 } 54 55 } 56 }