什么是“钩子”,我该如何用Java编写一个?以及如何与内核通信以了解用户按下的键/向操作系统注册

虽然我搜索了很多,但我仍然不清楚“钩子”到底是什么。例如,我在wiki答案上阅读了这篇文章:

钩子是一种将一段代码插入另一段代码的方法,以便第一段代码在第二段代码之前执行,从而使第一段代码有机会监视和/或过滤第二段代码的行为。例如,鼠标挂钩,它允许挂钩代码监视鼠标,同时保留原始鼠标事件处理例程的功能。

我也读了这篇文章,但我仍然不明白“钩子”到底是什么。有人可以用通俗的话解释一下什么是“钩子”吗?为什么有些人会写一个“钩子”?另外,有没有可能用Java写一个“钩子”?

注意:

我想用java写一个键盘记录器,我的一个朋友说你必须用C写一个“钩子”。我不能用Java编写整个键盘记录器(只能在Windows上运行)吗?

编辑

请给出一个答案 w.r.t 键盘记录器.我如何要求提供有关使用挂钩向我的应用程序按下的键的信息?或者如何使用 JNI 向操作系统注册我的应用程序?我希望我的应用程序记录用户按下的键。kernel


答案 1

我会将“钩子”这个词与至少两个不同的概念联系起来:

a) 观察者模式,其中类允许您添加一个侦听器,该侦听器将在特定事件时收到通知。你可以在Swing,Servlet API和许多第三方框架中找到它。

b) 模板方法模式。抽象类定义以什么顺序调用哪些方法,并且实现类可以重写这些方法。这样的例子并不常见,但你每隔一段时间就会看到它们。


答案 2

来自 Hooking - 维基百科

在计算机编程中,术语挂接涵盖了一系列技术,这些技术用于通过拦截软件组件之间传递的函数调用或消息或事件来改变或增强操作系统,应用程序或其他软件组件的行为。处理此类截获的函数调用、事件或消息的代码称为“钩子”。

Java中内置的一个很好的例子是 Runtime.addShutdownHook关机挂接只是一个初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行。

Runtime.addShutdownHook(new Thread(){
    @Override
    public void run(){
        // do something before application terminates
    }
});

推荐