Так что кроме некоторых хакерских рефлексий, я не вижу простого способа сделать это, к сожалению.В соответствии с JDK 1.6 крючки отключения хранятся в IdentityHashmap
, что не обеспечивает гарантированный порядок.По сути, перехватчики вызова вызываются в случайном порядке, в зависимости от внутренней части этой карты.
С точки зрения отражения я попытался сделать следующее, но hookMap
для меня получается нулевым.Если вы можете заставить его работать, то вы можете удалить хук log4j и вызвать его вручную в конце хука или что-то в этом роде.
Class<?> clazz = Class.forName("java.lang.ApplicationShutdownHooks");
Field field = clazz.getDeclaredField("hooks");
field.setAccessible(true);
@SuppressWarnings("unchecked")
Map<Thread, Thread> hookMap = (Map<Thread, Thread>) field.get(null);
Однако , я бы настоятельноРекомендую сделать что-то другое , чем отключение крюка.Как насчет вызова собственных хуков до окончания main
?Для нас мы активно используем Spring и шаблон DisposableBean
.Эти компоненты вызываются в обратном порядке с момента создания экземпляров классов, так что все, что зависит от регистраторов, все еще имеет регистратор, когда он выключается.
Надеюсь, это поможет.