Dynamique, SignalHandler réfléchissant en Java
-
03-10-2019 - |
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.
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);