小小程序猿
这个人很懒,什么都没写
Toggle navigation
小小程序猿
主页
关于
友链
归档
标签
动态代理
java动态代理
2021-08-30 22:33:35
53
0
0
terry
java动态代理
# 动态代理 ## 概念 1. What *代理是一种软件设计模式,目的地希望能做到代码重用。具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。* 2. Why *JDK的动态代理可以实现在JVM运行的过程中动态创建代理类,而不用针对每一个类写一个静态的代理类。* 3. How *使用 Proxy.newProxyInstance 方法创建动态代理类,JDK提供了InvocationHandler接口,可以实现这个接口并重写 invoke 方法* 4. Use ```java Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) ``` ## 测试 ```java // 接口 public interface HelloService { String hello(String name); } // 实现类 public class HelloServiceImpl implements HelloService{ @Override public String hello(String name) { return "Hello " + name; } } ``` + 静态代理 ```java // 静态代理 @Data public class HelloServiceProxy implements HelloService { //被代理的目标类 private HelloService helloService; @Override public String hello(String name) { System.out.println("预处理..."); String result = helloService.hello(name); System.out.println(result); System.out.println("后处理..."); return result; } } //客户端调用 public class Main { public static void main(String[] args){ HelloService helloService = new HelloServiceImpl(); HelloServiceProxy helloServiceProxy = new HelloServiceProxy(helloService); helloServiceProxy.hello("Panda"); } } ``` > *如有有100个类都实现了HelloService接口,需要写100个代理类。 o(╥﹏╥)o* + 动态代理 ```java // 动态代理 @Data @AllArgsConstructor class ProxyInvocationHandler implements InvocationHandler { private Class target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object rst = method.invoke(target,args); System.out.println(rst); return rst; } } //客户端调用 public static <T> void main(String[] args) throws ClassNotFoundException { // 生成的代理类保存在本地 // System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles","true"); ProxyInvocationHandler ProxyInvocationHandler = new ProxyInvocationHandler(HelloService.class); HelloService HelloServiceProxy = (HelloService) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class<?>[]{ProxyInvocationHandler.getTarget()}, ProxyInvocationHandler); HelloServiceProxy.hello("Panda"); } ```
上一篇:
手写一个迷你版的Mybatis
下一篇:
mybaits 源码解读
0
赞
53 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册