动态代理是指系统根据要代理的接口,自动帮我们生成并编译和加载代理类,并将代理类中的代理逻辑抽象到 InvocationHandler 的invoke方法中,由开发者实现。在静态代理中,我们需要自己实现代理类,将代理逻辑也写在代理类里面。而动态代理省去了我们自己写代理类的工作,系统只需要知道要代理的接口,然后利用反射获取接口的方法信息,生成代理类,代理类其实只是些模板代码,而又为了能定制代理逻辑,系统便定义了一个 InvocationHandler,生成的代理类中的方法都会调用 InvocationHandler 中的invoke方法,并将代理类对象,接口的方法对象,方法参数传入。所以真正的代理逻辑在 InvocationHandler 类中。
本质:就是将原来自己编写的代理类(静态代理)转化给系统帮我们自动生成。
接口:
目标对象:必须实现上面接口
动态代理:
注意:通过实现InvocationHandler 接口在invoke方法编写自己本身需要实现的业务逻辑。
而invoke方法在生成的代理对象调用自己方法时触发运行。
使用Proxy.newProxyInstance(
car.getClass().getClassLoader(),//此处的car对象必须是接口类型
car.getClass().getInterfaces(),//此处的car对象必须是接口类型
this);获取生成的代理对象。
测试: