对java动态代理的理解(简单易懂)

说明:本文主要从理论上简单抽象的解释动态代理的实际过程与优点,本文是个人对动态代理的理解,希望能帮到学习的小伙伴们,如有问题,请不吝赐教,谢谢。

 

1、何为代理?

解释:做好的东西(被代理类方法)不自己调用,而是交由别人(代理类)调用,这样别人还能在不改变你原本东西的基础上进行加工处理。

举例:被代理类实现了一个具体业务的方法,而代理类可以给这个方法加上事物控制。

好处:(1)代理类可以专注于实现自己的功能,一些公有的操作可以交给代理类来做。

           (2)可以在不改变代理类源码的基础上对其增加一些特性。

 

2、动态代理与静态代理的区别

静态代理:代理类提前写好源码,编译使用。

动态代理:代理类字节码是由程序运行时根据被代理类的信息创建的,投入使用。

 

3、基于接口的动态代理的实现过程与理解

(1)根据被代理类的信息来创建代理类(信息包括同一个类加载器,实现同一个接口)

(2)因为实现的是同一个接口,所有代理类与被代理类具有接口中相同的方法签名(方法签名包括方法名与参数)

(3)主要过程:在需要调用被代理类的某个方法时,不直接调用它,而是转而去调用代理类中的同名方法,在该方法中再用调用

的代理类方法签名来反射调用被代理类中相应的方法(基于过程2),并在该方法执行前、后、异常时做相应处理,这就是对代理

类中方法的增强。(所谓增强,并没有在被代理类方法的中间插入代码,而是在方法执行前、后、出现异常时插入额外的代码)

总结:所谓代理,就是去调用代理类的同名方法,所谓增强,就是在该同名方法中做一些额外的操作。

好处:(1)不改变原方法的源码

           (2)如果很多方法都需要这个额外的操作,可以在代理类中只写一遍,就是无论你调用被代理类的什么方法,我都在被

代理类中执行需要的操作,再反射调用同名方法。

public class Client extends Thread{
    public static void main(String[] args) {
        final IAgent factory=new ComputerFactory();
        IAgent proxyFactory= (IAgent)Proxy.newProxyInstance
                (factory.getClass().getClassLoader(),
                factory.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws 
                        Throwable {
                        //额外处理
                        //.....
                        //反射调用代理类中的同名方法,得到结果
                        Object result=method.invoke(factory,args[0]);
                        //额外处理
                        //.....
                        //返回结果
                        return  result;
                    }
                });
        proxyFactory.sale(1000f);
    }
}

这是JDK自带的一种基于接口实现的动态代理,Proxy类中利用被代理类factory提供的类加载器,接口信息创建了一个使用相同类

加载器实现相同接口的新类proxyFactory,称为”代理类“,因为是实现相同接口,所有代理类对象拥有被代理类对象的相同方法签

名,在调用代理类的任何方法时,都会去执行实现了InvocationHandler接口并重写的invoke方法,在该方法中再用调用的代理类

方法签名来反射调用被代理类中相应方法,并在该方法执行前、后、异常时做相应处理,这就是对代理类中方法的增强。这样在

实际使用时,创建代理类对象,调用对象的方法即可。可以结合这段代码就能理解动态代理的所有过程了。

 

以上就是本人对动态代理的理解。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值