Frage

Wie installiere ich Signalbehandlungslogik iff sun.misc.Signal ist verfügbar?

Hintergrund Die erste Generation meines Codes, die Signalhandhabungs Verfügbarkeit angenommen, sah etwa so aus:

class MyApp {
    public static void main(String[] args) {
        ...
        Signal.handle(term_sig, new SignalHandler() {
            public void handle(Signal sig) { ... }
        });
        ...
    }
}

Ich glaube, ich verstehe, wie man reflexiv Test und Verwendung Signal-Handler -. Class.forName("sun.misc.Signal"), reflektiv Anruf Signal.handle, usw.

war mein Impuls einfach eine andere anonyme innere Klasse mit der dynamisch erhielt SignalHandler Klasse zu instanziiert, aber ich denke, das ist nur Wunsch Syntax.

War es hilfreich?

Lösung

Sie verwenden müssen, um eine Dynamische Proxy die Signalhandler-Schnittstelle zu implementieren. Der Rest ist nur grundlegende Reflexion.

Aktualisieren

Hier ist, wie Sie es tun. Beachten Sie, ich habe den Try-Catch weggelassen, dass Bedürfnisse all dies wickeln

        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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top