欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

在Java中玩转Hook功能(实用的函数挂钩技巧)

最编程 2024-02-11 21:43:37
...

原理:钩子函数,顾名思义,就是位于函数中的一个钩子

钩子函数常常用于模板方法模式

何为模板方法模式?

模板方法模式可以使用抽象类来实现,父类(也就是抽象类)中对接口中部分方法进行实现,留出一部分方法给子类进行实现,从而使得

子类不需要实现所有接口中的方法

那么,结合钩子函数的特点,在抽象类中留给子类实现的方法都是钩子函数

代码:

/**
 * 基本方法尽量设置为protected类型的
 */
public abstract class AbstractClass implements MyInterface {
​
    //基本方法1
    protected abstract void doSomethig();
    //基本方法2
    protected abstract void doAnything();
    //基本方法3
    protected abstract void alarm();
    //模板方法
    public void templateMethod(){
        this.doSomethig();
        if (this.isAlarm()){
            this.alarm();
        }
        this.doAnything();
    }
​
    //扩展,钩子方法
    //我们的抽象类中isAlarm的返回值影响了模板方法中的执行结果,就叫钩子方法
    protected boolean isAlarm(){
        return true;
    }
​
}
​

钩子函数也可以出现在父子类中

例如早期的LinkedHashMap,尽管init()方法定义在HashMap中,但是由于LinkedHashMap重写了init方法,所以根据多态的语法,会调用

LinkedHashMap的init方法,该方法初始化了一个Header , 这个Header就是双向链表的链表头。

public LinkedHashMap() {
    //调用HashMap中的方法
    super();
    accessOrder = false;
}
public class HashMap{
    //构造方法
    public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        table = new Entry[DEFAULT_INITIAL_CAPACITY];
        init();
    }
    //HashMap中的init方法
    public init(){
        
    }
}
​
​
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{
    @Override
    void init(){
        header=new Entry<K,V>(-1,null,null,null);
        header.before=head.after=head;
    }
}

\

推荐阅读