动态代理详解

本文介绍了Java动态代理的概念,包括静态代理的对比,重点讲解了JDK动态代理(基于接口和类)的原理,以及通过InvocationHandler接口实现代理的过程。通用代理类的示例展示了如何通过一个类实现代理任何接口的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态代理

静态代理回顾

1.动态代理和静态代理的觉角色一样

2.动态代理的代理类是动态生成的不是我们直接写好的

3.动态代理分为两大类:基于接口的动态代理,基于类的动态代理

  • 基于接口—jdk动态代理
  • 基于类的动态代理—cglib
  • java字节码实现:javassist(JBoss服务器) 优点:简单快速

4.jdk动态代理的两个类:Proxy:代理,InvocationHandler:调用处理程序(反射包下的接口)

实现InvocationHandler接口,实现invoke方法,在invoke方法中调用需要代理的方法(反射),然后需要返回一个Proxy对象,我们只需要的到这个Proxy对象就可以调用增强过的方法了。
接口:

public class Client
{
    public static void main(String[] args) {
        Host host = new Host();

        MyProxy myProxy = new MyProxy(host);

        Rent proxy = (Rent)myProxy.getProxy();

        proxy.getHouse();

    }
}

房东:

public class Host implements Rent{
    @Override
    public void getHouse() {
        System.out.println("房东收钱了");
    }
}

代理类:

public class MyProxy implements InvocationHandler {

    private Rent rent;

    MyProxy (Rent rent)
    {
        this.rent = rent;
    }


    public Object getProxy()
    {
    	//固定这样写
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
    }

    //调用代理对象的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
        System.out.println("中介处理完工作了");
        Object result = method.invoke(rent, args);


        return result;
    }
}

调用:

public class Client
{
    public static void main(String[] args) {
        Host host = new Host();

        MyProxy myProxy = new MyProxy(host);

        Rent proxy = (Rent)myProxy.getProxy();

        proxy.getHouse();

    }
}

结果:

中介处理完工作了
房东收钱了

通用代理类:

public class MyProxy implements InvocationHandler {

    private Object target;

    MyProxy (Object target)
    {
        this.target = target;
    }


    public Object getProxy()
    {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    //调用代理对象的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("中介处理完工作了");
        Object result = method.invoke(target, args);


        return result;
    }
}

结果:

中介处理完工作了
房东收钱了

总结:

我们通过这个接口就可以传入任何接口的实现类,来实现代理,但是我们只用写一个类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值