Question

Comment puis-je installer une logique de manipulation ssi sun.misc.Signal est disponible le signal?

Historique La première génération de mon code, ce qui suppose la disponibilité traitement du signal, quelque chose qui ressemblait à ceci:

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

Je crois que je comprends comment tester pensivement pour et les gestionnaires de signaux utilisation -. Class.forName("sun.misc.Signal"), Signal.handle d'appel pensivement, et ainsi de suite

Mon impulsion était simplement instancier une autre classe interne anonyme avec la classe SignalHandler dynamique obtenue, mais je pense que la syntaxe est juste wishful.

Était-ce utile?

La solution

Vous devez utiliser un Dynamic Proxy pour implémenter l'interface SignalHandler. Le reste est juste une réflexion de base.

Mise à jour

Voici comment vous le faites. Remarque, j'ai omis le try-catch qui doit envelopper tout cela

        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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top