反射应用之动态代理

参考链接:http://blog.csdn.net/hejingyuan6/article/details/36203505

动态代理与静态代理的区别

静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了(先编译生成.class字节码文件,然后在jvm中运行.class文件)。

动态:在程序运行时运用反射机制动态创建而成(不在编译时确定代理类,而是运行时根据你被代理的类是什么,给你动态的创建)。

代码示例:

   //动态代理的使用
interface Subject{
void action();//默认为public abstract
}
class RealSubject implements Subject{
@Override
public void action() {
System.out.println("我是被代理类,我将被执行");
}
}

class MyInvocationHandler implements InvocationHandler{

Object obj;//实现了接口的被代理类的对象的声明(“因为代理类是动态实现的”)
//定义一个方法用于给“被代理类的对象实例化”和“返回一个代理类的对象”
public Object blind(Object obj){
this.obj=obj;
//看看你(被代理类)实现了哪些接口,实现了哪些类,this:实现了InvocationHandler接口的实现类的对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}

//当通过代理类的对象发起对被重写的方法的调用时,都会转化为对如下的invoke()方法的调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method方法的返回值是returnVal
Object returnVal=method.invoke(obj,args);
return returnVal;
}
}

public class TestProxy {
public static void main(String[] args) {
//1、被代理类的对象
RealSubject real=new RealSubject();
//2、创建一个实现了InvocationHandler接口类的对象
MyInvocationHandler handler=new MyInvocationHandler();
//调用blind()方法,动态的返回一个同样实现了real所在类(被代理类)实现接口的Subject的代理类的对象
Object blind = handler.blind(real);//把要动态创建的类传进去,用于动态生成代理类
Subject sub=(Subject) blind;//此时的sub就是代理类的对象,即转化为“为哪个被代理类”服务(代理类)
sub.action();//转到对InvocationHandler接口的实现类的invoke()方法的调用
}
}

总结:静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。动态代理类通过一个代理类能完成全部的代理功能。
posted @ 2017-10-28 19:21  kelly_one  阅读(299)  评论(0编辑  收藏  举报