Dinamico, SignalHandler riflettente in Java
-
03-10-2019 - |
Domanda
Come si installa segnale logica di gestione se e solo se è disponibile sun.misc.Signal
?
Sfondo La prima generazione di mio codice, che ha assunto la gestione del segnale disponibilità, qualcosa sembrava questa:
class MyApp {
public static void main(String[] args) {
...
Signal.handle(term_sig, new SignalHandler() {
public void handle(Signal sig) { ... }
});
...
}
}
Credo di capire come prova riflessivo per e gestori di segnali uso -. Class.forName("sun.misc.Signal")
, Signal.handle
chiamata riflessivo, e così via
Il mio impulso fu semplicemente quello di istanziare un'altra classe interna anonima con la classe SignalHandler
ottenuto in modo dinamico, ma penso che sia la sintassi solo un pio desiderio.
Soluzione
È necessario utilizzare un Dinamico Proxy per implementare l'interfaccia SignalHandler. Il resto è riflesso solo di base.
Aggiorna
Ecco come si fa. Nota, ho omesso il try-catch che deve avvolgere tutto questo
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);