Динамический, отражающий сигнал Хаундлер в Java
-
03-10-2019 - |
Вопрос
Как установить логику обработки сигналов IFF sun.misc.Signal
доступен?
Задний планПервое поколение моего кода, который предполагал наличие сигналов на доступность, выглядел что-то подобное:
class MyApp {
public static void main(String[] args) {
...
Signal.handle(term_sig, new SignalHandler() {
public void handle(Signal sig) { ... }
});
...
}
}
Я считаю, что понимаю, как отражать тестирование и использовать обработчики сигналов - Class.forName("sun.misc.Signal")
, отражающе звонить Signal.handle
, и так далее.
Мой импульс был просто создать еще один анонимный внутренний класс с динамически полученным SignalHandler
Класс, но я думаю, что это просто заправочный синтаксис.
Решение
Вам нужно использовать Динамический прокси Для реализации интерфейса сигнализации. Остальное - это просто базовое отражение.
Обновлять
Вот как ты это делаешь. Примечание, я пропустил Try-Chav, который должен обернуть все это
Class<?> handlerCl = Class.forName("sun.misc.SignalHandler");
Class<?> signalCl = Class.forName("sun.misc.Signal");
Constructor signalCtor = signalCl.getConstructor(String.class);
Method signalHandle = signalCl.getMethod("handle", signalCl, handlerCl);
// Create a proxy class that implements SignalHandler
Class<?> proxyClass = Proxy.getProxyClass(signalCl.getClassLoader(),
handlerCl);
// This is used by the instance of proxyClass to dispatch method calls
InvocationHandler invHandler = new InvocationHandler()
{
public Object invoke(Object proxy,
Method method, Object[] args) throws Throwable
{
// proxy is the SignalHandler's "this" rederence
// method will be the handle(Signal) method
// args[0] will be an instance of Signal
// If you're using this object for multiple signals, you'll
// you'll need to use the "getName" method to determine which
// signal you have caught.
return null;
}
};
// Get the constructor and create an instance of proxyClass
Constructor<?> proxyCtor = proxyClass.getConstructor(InvocationHandler.class);
Object handler = proxyCtor.newInstance(invHandler);
// Create the signal and call Signal.handle to bind handler to signal
Object signal = signalCtor.newInstance("TERM");
signalHandle.invoke(null, signal, handler);