如果不懂JAVA反射如何使用,请前往我的博客文章查看:http://blog.csdn.net/csdn_aiyang/article/details/79045808
导语
我们知道J2EE框架的Spring就是通过动态代理优雅地实现了AOP编程,结果极大地提升了Web开发效率,因而使用代理机制进行API Hook可以让“方法增强”,也是框架的常用手段。同样,插件框架也广泛使用了代理机制来增强系统API从而达到插件化的目的。本文将带大家一起了解代理机制及Hook机制。
一、认识代理模式
1、代理是什么?
代理也称“委托”,分为静态代理和动态代理,代理模式也是常用的设计模式之一,具有方法增强、高扩展性的设计优势。其设计就是限制直接访问真实对象,而是访问该对象的代理类。这样的话,我们就保护了内部对象,如果有一天内部对象因为某个原因换了个名或者换了个方法字段等等,那对访问者来说一点不影响,因为他拿到的只是代理类而已,从而使该访问对象具有高扩展性。然而,代理类可以实现拦截方法,修改原方法的参数和返回值,满足了代理自身需求和目的,也就是是代理的方法增强性。
2、静态代理:
创建一个Image接口显示方法
public interface Image {
void display();
}
创建一个RealImage类实现Image接口
public class RealImage implements Image {
private String fileName;
public RealImage(String fileName){
this.fileName = fileName;
loadFromDisk(fileName);
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadFromDisk(String fileName){
System.out.println("Loading " + fileName);
}
}
创建代理类Proxy实现Image接口
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName = fileName;
}
@Override
public void display() {
if(realImage == null){
realImage = new RealImage(fileName);
}
realImage.display();
}
}
当被请求时,使用 ProxyImage 来获取 RealImage 类的对象。
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_10mb.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
3、动态代理:
是JDK提供的代理方式且只支持接口,在JVM虚拟机运行时动态生成一系列代理,主要利用反射机制在运行时创建的代理类。当静态代理类特别多的时候,我们就可以不用手写每一个静态代理类了,也不需要制定代理谁,在运行的时候指定一个代理类就行了,变得更灵活了。