1、变与不变的分离是设计Hook函数及应用框架的基本原则和手艺。
就android框架而言,所谓[不变]的部分,就是它属于各种应用程序件的共同部分,所以不随着应用的改变而改变,因此称之为不变。
分离出变与不变部分之后,就可以将不变部分写在父类别里,而不变的部分就写在子类别里,然后就有类别继承机制组织起来。
public class AA {
private String x;
AA(String str){ x = str; }
public void print(){ System.out.println(x); }
}
public class BB {
private int x;
BB(int k){ x = k; }
public void print(){ System.out.println(x); }
}
public class JMain {
public static void main(String[] args) {
AA a = new AA("hello");
a.print();
}}
把以上的程序分离出变与不变--->
步骤一:把AA和BB视为两个不同应用程序里的类别,并且观察其变与不变:
首先从数据成员上的差异,就能看出它们之间的变化点:
String x;<----> int x;
然后就能看出函数的会变的部分:
System.out.println(x);
步骤二:将会变的部分写在Hook函数里:
public class AA {
private String x;
AA(String str){ x = str; }
public final void template_print() {
System.out.println( hook_getData() ); }
public String hook_getData() { return x;
}
}
public class BB {
private int x;
BB(int k){ x = k; }
public final template_print() {
System.out.println( hook_getData() ); }
public String hook_getData() { return String.valueOf(x);
}
}
步骤三:将不变部分写入抽象类
public abstract class SuperAB {
public void template_print(){
System.out.println(hook_getData());
}
protected abstract String hook_getData();
}
public class AA extends SuperAB{
private String x;
AA(String str){ x = str; }
@Override protected String hook_getData() {
return x;
}}
public class BB extends SuperAB{
private int x;
BB(int k){ x = k; }
@Override protected String hook_getData() {
return String.valueOf(x);
}}
public class JMain {
public static void main(String[] args) {
AA a = new AA("hello");
a.template_print();
}}
框架的反向控制IOC
常见的实现机制有:
1、继承+Hook函数(例如Template Method)
2、委托+Hook函数(例如Observer)