静态代理与动态代理"/>
Java:静态代理与动态代理
代理模式:
为目标对象提供一个代理对象,外部对目标对象的访问,是通过代理委托进来的,以达到控制访问的目的。代理又分为静态代理和动态代理。
我们举个很常见的例子: 工厂会生产很多的玩具, 但是我们买玩具都是到商店买的, 而不是到工厂去买的,
工厂怎么生产我们并不关心, 我们只知道到商店可以买到自己想要的玩具,并且,如果我们需要送人的
商店可以把这些玩具使用礼品盒包装。这个工厂就是委托类, 商店就是代理类, 我们就是客户类。
静态代理:
由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
实现静态代理的四个步骤:
- 1)定义委托接口
- 2)定义委托类实现委托接口
- 3)定义代理类并实现委托接口
- 4)最后便可通过客户端进行调用(这里可以理解成程序的main方法里的内容)
staticProxy.java:
public class staicProxy {//1、定义委托接口public interface Speakable{public void speak(String message);}//2、委托类实现接口public static class Person implements Speakable{//重写@Overridepublic void speak(String message){System.out.println("Fast:"+message);}}//3、代理类实现接口public static class PersonProxy implements Speakable{private Person persion;public PersonProxy(Person persion){this.persion=persion;}//重写@Overridepublic void speak(String message){this.persion.speak(message);System.out.println("运行时间:"+System.currentTimeMillis());}}//4、客户端调用public static void main(String[] args){Person person=new Person();PersonProxy proxy=new PersonProxy(person);proxy.speak("Chinese");}
}
动态代理:
动态代理就是动态地创建代码并动态地处理方法的调用。
实现动态代理类的四个步骤:
- 1)创建委托类的接口和类
- 2)创建InvocationHandler接口的实现类,在invoke方法中实现代理逻辑
- 3)通过Proxy的静态方法
newProxyInstance( interfces.class.getClassLoader, Class[] interfaces, InvocationHandler h)
创建一个代理对象- 4)使用代理对象
dynamicProxy.java:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class dynamicProxy {//1、我们直接使用staticProxy.java中的委托类和接口类,就不创建了//2、创建InvocationHandler接口的实现类public static class MyProxy implements InvocationHandler {private Object proxied;//被代理对象,Object类型//有参构造器,传入委托类的对象public MyProxy(Object proxied){this.proxied=proxied;}//重写@Overridepublic Object invoke(Object proxied, Method method, Object[] args)throws Throwable{method.invoke(this.proxied,args);//给对象proxied传递args参数System.out.println("运行时间:"+System.currentTimeMillis());return null;}}public static void main(String[] args){//创建委托类对象staicProxy.Person person=new staicProxy.Person();//创建动态代理对象//第一个参数是指定代理类的类加载器(我们传入当前测试类的类加载器//第二个参数是代理类需要实现的接口(我们传入委托类实现的接口,这样生成的代理类和委托类就实现了相同的接口)//第三个参数是invocation handler,用来处理方法的调用。这里是我们自己实现的handlestaicProxy.Speakable speakable=(staicProxy.Speakable) Proxy. newProxyInstance(staicProxy.Speakable.class.getClassLoader(),new Class[]{staicProxy.Speakable.class},new MyProxy(person));speakable.speak("Chinese");}
}
更多推荐
Java:静态代理与动态代理
发布评论