> 文章列表 > 07动态代理

07动态代理

动态代理:代码增强的利器,代码注入的神器!

大家好啊!今天咱们来聊点有趣的东西——动态代理!

引言: 动态代理到底是个啥?简单概括,它就是一个能让你在不修改原代码的前提下,给代码加点“料”的东西!比如给你的方法加日志、事务管理、权限验证等等,这波我必须点个赞!

问题一:动态代理是怎么实现的?

答案:核心就是一句话——Proxy.newProxyInstance!这货可以帮你生成一个代理对象,然后通过InvocationHandler来实现方法调用的拦截。简单概括,就是通过反射机制,动态地生成一个代理类,然后把你要增强的代码塞进去。这就像给你的代码穿了一件“智能马甲”!

问题二:动态代理能干啥?

答案:能干的事儿多了去了!比如:日志记录、事务管理、权限验证、性能监控、缓存控制……只要你敢想,它就能干!比如,你可以在方法调用前后加日志,或者在方法调用失败时自动重试,这可比手工写日志方便多了!

问题三:动态代理跟静态代理有啥区别?

答案:静态代理需要你事先写好代理类,而动态代理则是“动态”生成的,根本不需要写代理类!这就意味着你可以用动态代理来代理任意接口,而静态代理则需要为每一个接口单独写一个代理类,这可太不划算了!

问题四:动态代理的缺点是什么?

答案:当然是性能问题了!因为它依赖于反射机制,所以在频繁调用时可能会有性能开销。但是,这点儿损失比起代码的灵活性和可维护性来说,真的不算什么!

整体而言:动态代理是个神器! 了解了动态代理,你就可以在不修改原代码的情况下,轻松实现各种功能增强。记住:动态代理不仅是工具,更是一种思维方式!现在是不是觉得代码维护变得简单了?

延伸思考: 你平时工作中有没有遇到需要动态代理的场景?比如,你是否需要在方法调用前后做一些处理?或者需要动态地改变方法的行为?这些都是动态代理大显身手的地方!

07动态代理

07动态代理

1、jdk的动态代理

​ 动态代理与静态代理的区别此处不再赘述,大家可以看马老师的设计模式视频,我们主要讲一下动态代理的实现原理,说明白原理的话肯定是要看源码了,大家不要慌,干就完了!!!

​ 其实在使用动态代理的时候最最核心的就是Proxy.newProxyInstance(loader, interfaces, h);废话不多说,直接干源码。

动态代理的样例代码:

Calculator.java

package com.mashibing;public interface Calculator {public int add(int i, int j);public int sub(int i, int j);public int mult(int i, int j);public int div(int i, int j);
}

MyCalculator.java

package com.mashibing;public class MyCalculator implements Calculator {public int add(int i, int j) {int result = i + j;return result;}public int sub(int i, int j) {int result = i - j;return result;}public int mult(int i, int j) {int result = i * j;return result;}public int div(int i, int j) {int result = i / j;return result;}
}

CalculatorProxy.java

package com.mashibing;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CalculatorProxy {public static Calculator getProxy(final Calculator calculator){ClassLoader loader = calculator.getClass().getClassLoader();Class<?>[] interfaces = calculator.getClass().getInterfaces();InvocationHandler h = new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = null;