java写游戏脚本如何钩子?java写游戏脚本钩子问题

java钩子方法源于设计模式中模板方法模式,模板方法就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。那java写游戏脚本如何钩子?下面来我们就来给大家讲解一下。

java写游戏脚本钩子问题.png

Java提供注册钩子线程,在JVM进程关闭之前,会自动执行这个钩子线程。

运用这个技巧,可以再JVM关闭之前,释放一些系统资源。

这个功能利用的是Runtime类来实现。

public class Hook
{
    public static void main(String args[])
    {
        System.out.println("程序开始执行");
        try
        {
            Thread.sleep(100);
        }
        catch (Exception ex)
        {}
        Runtime.getRuntime()
            .addShutdownHook(new Thread()
            {
                @Override
                public void run()
                {
                    System.out.println("执行钩子函数 -- " + 1);
                }
            });
        Runtime.getRuntime()
            .addShutdownHook(new Thread()
            {
                @Override
                public void run()
                {
                    System.out.println("执行钩子函数 -- " + 2);
                }
            });
        Runtime.getRuntime()
            .addShutdownHook(new Thread()
            {
                @Override
                public void run()
                {
                    System.out.println("执行钩子函数 -- " + 3);
                }
            });
        Runtime.getRuntime()
            .addShutdownHook(new Thread()
            {
                @Override
                public void run()
                {
                    System.out.println("执行钩子函数 -- " + 4);
                }
            });
        System.out.println("程序执行完毕,退出main");
    }
}

输出

可以看到,执行顺序和注册顺序是不一致的。一般也不会 注册多个钩子函数。

程序开始执行

程序执行完毕,退出main
执行钩子函数 -- 2
执行钩子函数 -- 3
执行钩子函数 -- 4
执行钩子函数 -- 1

同时,还提供了移除钩子函数的功能

public boolean removeShutdownHook(Thread hook)

钩子的工作原理:

当您创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,如果您安装的是一个进程钩子,您进程中的钩子函数将被调用。如果是一个系统钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以如果您想要使用系统钩子,就必须把该钩子函数放到动态链接库中去。当然有两个例外:工作日志钩子和工作日志回放钩子。这两个钩子的钩子函数必须在安装钩子的线程中。原因是:这两个钩子是用来监控比较底层的硬件事件的,既然是记录和回放,所有的事件就当然都是有先后次序的。所以如果把回调函数放在DLL中,输入的事件被放在几个线程中记录,所以我们无法保证得到正确的次序。故解决的办法是:把钩子函数放到单个的线程中,譬如安装钩子的线程。

几点需要说明的地方:

(1) 如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。

(2) 对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。而且最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。

(3) 钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。

这就是java钩子的使用原理,java钩子由抽象类声明并且实现,子类也可以选择加以扩展,最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。

推荐阅读:

redis性能怎么优化?redis+骚操作项目之redis性能优化

Java语句如何入门?java初学者入门教程之Java语句入门

java书写main方法怎么弄?Java main方法常见问题