基于jdk的动态代理实现方式详解

Proxy和InvocationHandler的一个关系?
1.Proxy并不是代理类,作用是用来去创建代理类,这个Proxy仅仅是创建代理类并返回代理类的实例对象,并不做实际性的工作(就是调用真实对象身上的方法,例如租房rent)
2.做实质性的工作是由InvocationHandler来去做的
编写动态代理类的步骤:
1.去自定义一个类,这个类实现InvocationHandler接口,并重写invoke方法
2.编写抽象角色/公共接口/Subject接口
3.编写真实对象/RealSubject/房东
4.通过Proxy工具类去创建动态代理类
5.编写客户/Test类

/**
 * 抽象角色
 *      代理角色和真实角色共同标准
 */
public interface Subject {

    //租房
    void rent();
}

/**
 * 真实角色
 *     房东
 */
public class RealSubject implements Subject{
    @Override
    public void rent() {
        System.out.println("房东说:我得房子一个月300块钱");
    }
}

接下来自定义一个调用处理器MyInvocationHandler,我们渴望MyInvocationHandler帮我们解决代理的问题。
MyInvocationHandler作用:做实质性工作,所以必须要有真实对象,这里的真实对象是房东

/**
 *  自己定义调用处理器
 *  MyInvocationHandler
 *      作用:做实质性工作
 *      思路:必须要有真实对象/房东
 *
 */
public class MyInvocationHandler implements InvocationHandler {
    //此处该如何去写才能够表达可以代理所有的真实对象呢?
    private Object object;  //目标,真实对象

    public MyInvocationHandler(Object object) {
        this.object = object;
    }

    /**
     *       invoke:当代理对象去调用方法的时候,invoke就会自动得到调用
     * @param proxy:代理类
     * @param method:代理实例对象调用的那个方法,rent方法
     * @param args:方法的参数rent方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.doSomeThing1();

        // 才是真正的表示调用的是目标对象身上的方法
        method.invoke(object, args);

        this.doSomeThing2();
        return null;
    }

    private void doSomeThing1(){
        System.out.println("这个是咨询费100块钱");
    }

    private void doSomeThing2(){
        System.out.println("租房完成后,手续费300块钱");
    }
}

以上我们只是自己定义调用处理器,接下来需要使用Proxy创建代理类并返回代理类的实例对象

import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        MyInvocationHandler invocationHandler = new MyInvocationHandler(realSubject);
        Subject subject = (Subject) Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(),
                invocationHandler);
        subject.rent();
    }
}

1.InvocationHandler:
作用:调用处理器,每一个代理实例都会有一个与之关联的调用处理器。
方法:invoke
执行流程:当一个代理实例去调用一个方法的时候,这个方法就会立刻被编码并且被派发到invoke方法中。直白一点:代理实例调用方法:这个invoke就会自动得到调用。
3.Proxy
作用:仅仅是一个工具类。Proxy作用是来创建代理类。
目的:该类提供了很多的静态方法,来去帮助我们创建动态代理类和代理类实例对象。通过Proxy类创建的动态代理类都是Proxy类的字类。
总结:
Proxy并不是代理类,作用是用来去创建代理类,这个Proxy仅仅是创建代理类并返回代理类的实例对象,并不做实际性的工作(就是调用真实对象身上的方法,例如租房rent)。想要去创建动态代理类,需要使用Proxy这个工具类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值