• 动态代理-JDK


    1.必须创建接口

    关键:

    使用 Proxy 类创建 代理类对象 (需要传入代理类对象,目标类装载类,目标类接口)

    1. //返回一个指定接口的代理类实例(是一个接口对象)
    2. Object o = Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), // 目标类对象的装载类
    3. UserServiceImpl.class.getInterfaces(), // 目标类接口
    4. jdkProxy); //指派到指定的调用处理类对象

    1.接口

    1. package com.lt.test.service;
    2. public interface UserService {
    3. void func();
    4. void func2();
    5. }

    2.实现类

    1. package com.lt.test.service.impl;
    2. import com.lt.test.service.UserService;
    3. public class UserServiceImpl implements UserService {
    4. @Override
    5. public void func() {
    6. System.out.println("目标类方法1");
    7. }
    8. @Override
    9. public void func2() {
    10. System.out.println("目标方法2");
    11. }
    12. }

    3.代理类1

    1. package com.lt.test.proxy;
    2. import java.lang.reflect.InvocationHandler;
    3. import java.lang.reflect.Method;
    4. //动态代理类
    5. public class JDKProxy implements InvocationHandler {
    6. private Object target;
    7. //传入需要代理的目标对象
    8. public JDKProxy(Object target) {
    9. this.target = target;
    10. }
    11. //方法调用
    12. @Override
    13. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    14. if("func".equals(method.getName())){
    15. System.out.println("before func");
    16. Object result = method.invoke(target,args); //传入方法,参数,和目标对象
    17. System.out.println("after func");
    18. return result;
    19. } else if("func2".equals(method.getName())){
    20. System.out.println("before func2");
    21. Object result = method.invoke(target,args); //传入方法,参数,和目标对象
    22. System.out.println("after func2");
    23. return result;
    24. }
    25. return null; //返回值
    26. }
    27. }

    代理类2

    1. package com.lt.test.proxy;
    2. import java.lang.reflect.InvocationHandler;
    3. import java.lang.reflect.Method;
    4. //动态代理类
    5. public class JDKfun2Proxy implements InvocationHandler {
    6. private Object target;
    7. //传入需要代理的目标对象
    8. public JDKfun2Proxy(Object target) {
    9. this.target = target;
    10. }
    11. //方法调用
    12. @Override
    13. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    14. System.out.println("before func2 JDKfun2Proxy");
    15. Object result = method.invoke(target,args); //传入方法,参数,和目标对象
    16. System.out.println("after func2 JDKfun2Proxy");
    17. return result;
    18. }
    19. }

    4.测试类

    1. package com.lt.test;
    2. import com.lt.test.proxy.JDKProxy;
    3. import com.lt.test.proxy.JDKfun2Proxy;
    4. import com.lt.test.service.UserService;
    5. import com.lt.test.service.impl.UserServiceImpl;
    6. import java.lang.reflect.InvocationTargetException;
    7. import java.lang.reflect.Method;
    8. import java.lang.reflect.Proxy;
    9. public class demo3 {
    10. public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    11. UserServiceImpl userService = new UserServiceImpl();
    12. userService.func();
    13. userService.func2();
    14. JDKProxy jdkProxy = new JDKProxy(userService); //指派到指定的调用处理类对象。
    15. //强类型转换调用
    16. UserService userService1 = (UserService) Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), jdkProxy);
    17. userService1.func();
    18. userService1.func2();
    19. //返回一个指定接口的代理类实例(是一个接口对象)
    20. Object o = Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), // 目标类对象的装载类
    21. UserServiceImpl.class.getInterfaces(), // 目标类接口
    22. jdkProxy); //指派到指定的调用处理类对象
    23. System.out.println(o instanceof UserService);
    24. //反射的方式去调用目标类方法
    25. Class aClass = o.getClass();
    26. Method func = aClass.getDeclaredMethod("func");
    27. func.setAccessible(true); //突破封装限制
    28. Method func2 = aClass.getDeclaredMethod("func2");
    29. func2.setAccessible(true); // 突破封装限制
    30. func.invoke(o);
    31. func2.invoke(o);
    32. //其他代理类对象创建
    33. JDKfun2Proxy jdKfun2Proxy = new JDKfun2Proxy(userService);
    34. Object o1 = Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), jdKfun2Proxy);
    35. Class aClass1 = o1.getClass();
    36. Method func21 = aClass1.getDeclaredMethod("func2");
    37. func21.setAccessible(true);
    38. func21.invoke(o1);
    39. }
    40. }

    输出

     

  • 相关阅读:
    linux命令
    java反序列化专项
    制造业仓库很乱,该如何有效的管理呢?
    贯穿嵌入式开发的编程语言?
    Tomcat服务部署和优化
    组件component二次开发属性暴露,跟渲染元素属性暴露类似,但主要是canvas画笔来绘制组件图形
    视频监控接入汇聚平台的接入和汇聚,在应急管理场景的应用和解决方案
    10.16 qt作业
    MFC Windows 程序设计[198]之时间日期控件(附源码)
    106期_2022-09-24_linux基本操作
  • 原文地址:https://blog.csdn.net/Listest/article/details/126784463