2010-05-06 4 views
2

Как установить логику обработки сигналов iff sun.misc.Signal?Динамический, отражающий SignalHandler в Java

фон Первое поколение моего кода, который предполагается наличие обработки сигнала, выглядел примерно так:

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, но я думаю, что это просто желаемый синтаксис.

ответ

3

Чтобы реализовать интерфейс SignalHandler, вам необходимо использовать Dynamic Proxy. Остальное - просто основное отражение.

Update

Вот как вы это делаете. Заметьте, я пропустил try-catch, который должен обернуть все это

 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); 
+0

Каким будет динамический прокси-сервер в этом случае? – pilcrow

+0

Спасибо, это только то особое руководство, которое я искал! – pilcrow

+0

Прохладный, это будет мое первое использование класса Proxy. –