Java基础之-代理

来源:互联网 发布:网络接口转换器怎么用 编辑:程序博客网 时间:2024/05/17 00:03

0.代理

代理是基本的设计模式之一,是为了提供额外或者不同的操作,而插入的用来代替“实际”对象的操作,代理通常充斥着中间人的角色。
java中的代码分为静态代理和动态代理。

1.静态代理

代理类在程序运行之前就存在叫静态代理,我们来举个例子。
生命一个接口action。

public interface Action {    void work();    void sleep();}

实现该接口的实际类

public class RealObjet implements Action {    @Override    public void work() {        System.err.println("realobject work");    }    @Override    public void sleep() {        System.err.println("realobject sleep");    }}

代理类也需要实现那个接口,并且在静态代理中,需要我们将实际的实现类,传入进去。

public class ProxyObject implements Action {    RealObjet realObjet;    public ProxyObject(RealObjet realObjet){        this.realObjet = realObjet;    }    @Override    public void work() {        realObjet.work();    }    @Override    public void sleep() {        realObjet.sleep();    }}

最后测试。

        RealObjet realObjet = new RealObjet();        ProxyObject proxy = new ProxyObject(realObjet);        proxy.work();        proxy.sleep();

来看下输出结果,这就是一个非常简单的静态代理的例子。
这里写图片描述

2.动态代理

代理类在运行之前是不存在的,运行过程中由程序动态生成的叫动态代理。实现动态代理的步奏如下。

  • 新建委托类(真正的实现类)
  • 实现InvocationHandler接口,负责链接代理类和委托类
  • 通过Proxy类新建代理类对象

这里的委托类我们还用上面的RealObject。我们看下InvocationHandler接口的实现。

public class RealInvocationHandler implements InvocationHandler {    private Object object;    public RealInvocationHandler(Object object){        this.object = object;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Object object = (Action) method.invoke(this.object,args);        System.err.println("invoke:"+ method.getName());        return object;    }}

这里需要注意几个地方。

  • 这里所有的地方都需要用Object

好,我们看下最后一步的实现。

        RealInvocationHandler invocationHandler = new RealInvocationHandler(new RealObject());        Action action = (Action) Proxy.newProxyInstance(Action.class.getClassLoader(),new Class[]{Action.class},                invocationHandler);        action.work();        action.sleep();

细心的同学会发现,在上面,我们使用的是委托类实现的接口Action,这里一定要注意,构造InvocationHandler的时候,使用委托类,而在其他地方,一定要用委托类的接口,一定要注意。

3. 作用 是什么

从上面我们可以知道,通过代理我们能在方法执行前后做一些操作,好吧,我编不下去了。详情请看。
Java 动态代理作用是什么?

0 3
原创粉丝点击