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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top