类型 | 机制 | 回调方式 | 适用场景 | 服从 |
JDK | 委托机制,代理类和目标类都实现了同样的接口,InvocationHandler持有目标类,代理类委托InvocationHandler去调用目标类的原始方法 | 反射 | 目标类是接口类 | 服从瓶颈在反射调用稍慢 |
CGLIB | 继承机制,代理类继承了目标类并重写了目标方法,通过回调函数MethodInterceptor调用父类方法实行原始逻辑 | 通过FastClass方法索引调用 | 非接口类,非final类,非final方法 | 第一次调用因为要生成多个Class对象较JDK方式慢,多次调用因为有方法索引较反射方式快,如果方法过多switch case过多其服从还需测试 |
service/IUserService.javapublic interface IUserService { String queryUserNameById(String userId);}
service/UserService.javapublic class UserService implements IUserService { public String queryUserNameById(String userId) { return "hi user " + userId; }}JDK动态代理
reflect/JDKInvocationHandler.java & 代理类反射调用
reflect/JDKProxy.java & 定义一个代理类获取的服务
ApiTest.test_proxy_jdk() & 实行调用并输出反射类的字节码
cglib/CglibProxy.java
ApiTest.test_proxy_cglib() & 调用代理类@Testpublic void test_proxy_cglib() { CglibProxy cglibProxy = new CglibProxy(); UserService userService = (UserService) cglibProxy.newInstall(new UserService()); String userName = userService.queryUserNameById("10001"); System.out.println(userName);}输出结果
欢迎光临 创意电子 (https://wxcydz.cc/) | Powered by Discuz! X3.4 |