Java基础之-代理

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 动态代理作用是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值