gpt4 book ai didi

java - Java 中的动态、反射 SignalHandler

转载 作者:行者123 更新时间:2023-12-04 06:53:32 24 4
gpt4 key购买 nike

我如何安装信号处理逻辑 iff sun.misc.Signal可用吗?

背景
我的第一代代码假设信号处理可用,看起来像这样:

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

我相信我了解如何反射性地测试和使用信号处理程序 -- Class.forName("sun.misc.Signal") ,反射(reflection)性地调用 Signal.handle ,等等。

我的冲动只是用动态获得的 SignalHandler 实例化另一个匿名内部类。类,但我认为这只是一厢情愿的语法。

最佳答案

您需要使用 Dynamic Proxy实现 SignalHandler 接口(interface)。剩下的只是基本的反射(reflection)。

更新

这是你如何做到的。请注意,我省略了需要包装所有这些的 try-catch

        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);

关于java - Java 中的动态、反射 SignalHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com