java 设计模式-----代理模式

左手的ㄟ右手 2022-12-02 15:10 268阅读 0赞

最近经常被人问到代理模式,好好研究一下,如何实现相关过程吧

代理模式

      • java 代理模式 基本思想
      • java 代理模式 实现方式
      • java代理模式 具体运用

java 代理模式 基本思想

代理模式就是不去修改代码增加功能,对原先的类和方法进行扩展。

java 代理模式 实现方式

静态代理:

实现方法是直接可以写一个代理类,在调用方法的时候通过代理类进行记录相关的操作

动态代理:

jdk 动态代理

参考:https://blog.csdn.net/jiankunking/article/details/52143504

首先jdk的动态代理只能代理接口,而且aop优先使用jdk的动态代理,代理使用到接口InvocationHandle 接口,实现他的invoke的方法,向里面传类及参数数组代理类的信息

下面是具体的实例

  1. /** * @{#} JdkCat.java Create on 2020年9月10日 上午10:51:51 * * Copyright (c) 2013 by Logan. */
  2. package test.aop.jdk;
  3. /** * @author jiangcl * @version 1.0 * @desc */
  4. public interface JdkCat {
  5. public void eat();
  6. public String run(int times);
  7. }
  8. /** * @{#} JdkActionProxy.java Create on 2020年9月10日 上午10:50:57 * * Copyright (c) 2013 by Logan. */
  9. package test.aop.jdk;
  10. /** * @author jiangcl * @version 1.0 * @desc */
  11. public class JdkActionProxy implements JdkCat{
  12. public void run() {
  13. System.out.println("run 方法执行了");
  14. }
  15. @Override
  16. public void eat() {
  17. // TODO Auto-generated method stub
  18. System.out.println("eat 方法执行了");
  19. }
  20. @Override
  21. public String run(int times) {
  22. // TODO Auto-generated method stub
  23. System.out.println("eat 方法执行了:"+times);
  24. return "sccess";
  25. }
  26. }
  27. /** * @{#} InvocationHandlerImple.java Create on 2020年9月10日 上午10:57:21 * * Copyright (c) 2013 by Logan. */
  28. package test.aop.jdk;
  29. import java.lang.reflect.InvocationHandler;
  30. import java.lang.reflect.Method;
  31. /** * @author jiangcl * @version 1.0 * @desc */
  32. public class InvocationHandlerImple implements InvocationHandler{
  33. public JdkCat jdkCat;
  34. public InvocationHandlerImple(JdkCat jdkCat){
  35. this.jdkCat = jdkCat ;
  36. }
  37. public void before() {
  38. System.out.println("before 执行力");
  39. }
  40. @Override
  41. public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
  42. // TODO Auto-generated method stub
  43. this.before();
  44. System.out.println("执行的方法:"+arg1.getName());
  45. if(arg2!=null) {
  46. for(int i = 0;i<arg2.length;i++) {
  47. System.out.println(arg2[i]);
  48. }
  49. }
  50. Object value = arg1.invoke(jdkCat, arg2);
  51. this.after();
  52. return value;
  53. }
  54. public void after() {
  55. System.out.println("after 执行力");
  56. }
  57. }
  58. /** * @{#} JdkProxyTest.java Create on 2020年9月10日 上午10:51:21 * * Copyright (c) 2013 by Logan. */
  59. package test.aop.jdk;
  60. import java.lang.reflect.InvocationHandler;
  61. import java.lang.reflect.Proxy;
  62. /** * @author jiangcl * @version 1.0 * @desc */
  63. public class JdkProxyTest {
  64. public static void main(String[] args) {
  65. JdkCat jdkCat = new JdkActionProxy();
  66. InvocationHandler invocationHandler = new InvocationHandlerImple(jdkCat);
  67. ClassLoader loader = jdkCat.getClass().getClassLoader();
  68. Class[] interfaces = jdkCat.getClass().getInterfaces();
  69. JdkCat jdkCat1 = (JdkCat) Proxy.newProxyInstance(loader, interfaces, invocationHandler);
  70. System.out.println(jdkCat1.getClass().getName());
  71. // 有参数
  72. jdkCat1.run(66);
  73. // 无参数
  74. jdkCat1.eat();
  75. }
  76. }

在这里插入图片描述

cglib 代理

相关代码:

  1. /** * @{#} Dog.java Create on 2020年9月10日 下午2:49:02 * * Copyright (c) 2013 by Logan. */
  2. package test.aop.cglib;
  3. /** * @author jiangcl * @version 1.0 * @desc */
  4. public class Dog {
  5. public void eat(String arg) {
  6. System.out.println("eat 方法执行了,吃:"+arg);
  7. }
  8. public void run() {
  9. System.out.println("run 方法执行了");
  10. }
  11. }
  12. /** * @{#} MyMethodInterceptor.java Create on 2020年9月10日 下午2:59:51 * * Copyright (c) 2013 by Logan. */
  13. package test.aop.cglib;
  14. import java.lang.reflect.Method;
  15. import net.sf.cglib.proxy.MethodInterceptor;
  16. import net.sf.cglib.proxy.MethodProxy;
  17. /** * @author jiangcl * @version 1.0 * @desc */
  18. public class MyMethodInterceptor implements MethodInterceptor {
  19. @Override
  20. public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
  21. // TODO Auto-generated method stub
  22. System.out.println("方法开始.....");
  23. System.out.println(arg1.getName());
  24. if(arg2!=null) {
  25. for(int i = 0;i<arg2.length;i++) {
  26. System.out.println(arg2[i]);
  27. }
  28. }
  29. Object object = arg3.invokeSuper(arg0, arg2);
  30. System.out.println("方法结束.....");
  31. return object;
  32. }
  33. }
  34. /** * @{#} CglibTest.java Create on 2020年9月10日 下午3:08:42 * * Copyright (c) 2013 by Logan. */
  35. package test.aop.cglib;
  36. import net.sf.cglib.core.DebuggingClassWriter;
  37. import net.sf.cglib.proxy.Enhancer;
  38. /** * @author jiangcl * @version 1.0 * @desc */
  39. public class CglibTest {
  40. public static void main(String[] args) {
  41. //System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "C:\\java\\java_workapace");
  42. //创建Enhancer对象,类似于JDK动态代理的Proxy类,下一步就是设置几个参数
  43. Enhancer enhancer = new Enhancer();
  44. //设置目标类的字节码文件
  45. enhancer.setSuperclass(Dog.class);
  46. //设置回调函数
  47. enhancer.setCallback(new MyMethodInterceptor());
  48. //这里的creat方法就是正式创建代理类
  49. Dog proxyDog = (Dog)enhancer.create();
  50. //调用代理类的eat方法
  51. proxyDog.eat("shi");
  52. proxyDog.run();
  53. }
  54. }

java代理模式 具体运用

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java设计模式代理模式

    什么是代理模式?   对于一个类的方法的调用,不直接通过该类的对象来调用方法,程序里有一个专门的代理类,通过调用代理类的方法来实现真实类内部方法的调用。   特征是:代理类