• java动态代理


    动态代理

    代理:辅助对象处理一些操作,为对象的行为做代理(明星的经纪人)。

    动态代理调用方法的流程

    1. 走向代理
    2. 代理为方法额外做一些辅助工作
    3. 触发真正的对象方法执行
    4. 回到代理中,由代理返回结果给方法调用者

    实现动态代理的步骤

    1. 必须定义接口
    2. 被代理对象必须实现接口
    3. 使用Proxy类提供的newProxyInstance方法,得到对象的代理对象

    动态代理例子

    1. //被代理对象的技能接口
    2. public interface Skill {
    3. void sing();
    4. void dance();
    5. }
    6. //明星类(实现Skill接口)
    7. public class Star implements Skill{
    8. String name;
    9. public Star(String name) {
    10. this.name = name;
    11. }
    12. @Override
    13. public void sing() {
    14. System.out.println(name + "开始唱《爱你》");
    15. }
    16. @Override
    17. public void dance() {
    18. System.out.println(name + "开始跳宅舞");
    19. }
    20. }
    21. //明星的代理人类
    22. public class StarAgent {
    23. public static Skill getProxy(Star obj) {
    24. //3.用传入的被代理对象构造代理对象,并以接口类型返回
    25. return (Skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
    26. @Override
    27. //method:传入的方法 args:传入的参数
    28. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    29. //4.额外的操作(动态代理的目的)
    30. System.out.println("收首付款");
    31. //5.真正调用被代理对象的方法
    32. Object result = method.invoke(obj,args);
    33. System.out.println("收尾付款");
    34. return result;
    35. }
    36. });
    37. }
    38. }
    39. //测试类
    40. public class Test {
    41. public static void main(String[] args) {
    42. //1.实例化被代理的对象
    43. Star s1 = new Star("杨超越");
    44. //2.将被代理对象传入代理类方法
    45. Skill s2 = StarAgent.getProxy(s1);
    46. //6.实际是通过代理对象调用的方法
    47. s2.sing();
    48. s2.dance();
    49. }
    50. }
    51. 输出结果:
    52. 收首付款
    53. 杨超越开始唱《爱你》
    54. 收尾付款
    55. 收首付款
    56. 杨超越开始跳宅舞
    57. 收尾付款

     

    动态代理的作用

    1. 在不改变方法源码的情况下,增强方法功能,提高复用性

    2. 提高开发效率和可扩展性

    3. 可为被代理对象所有方法做代理

    4. 可以为任意接口的实现类对象做代理

      1. public class StarAgent {
      2. //将接口类型改为T(任意类型)
      3. public static T getProxy(T obj) {
      4. return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
      5. @Override
      6. //method:传入的方法 args:传入的参数
      7. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      8. System.out.println("收首付款");
      9. Object result = method.invoke(obj,args);
      10. System.out.println("收尾付款");
      11. return result;
      12. }
      13. });
      14. }
      15. }

  • 相关阅读:
    18scala笔记
    Infer的安装及基本使用
    wpf devexpress 绑定数据编辑器
    NewStarCTF2023week4-RSA Variation II
    快手根据ID取商品详情 API 返回值说明
    远程桌面由于以下原因之一无法连接到远程计算机解决方法(亲测)
    机器学习——逻辑回归
    Docker安装Nginx并修改Nginx配置文件
    [idekCTF 2022]Paywall - LFI+伪协议+filter_chain
    常量左值引用作为形参来接收右值引用实参所带来的问题
  • 原文地址:https://blog.csdn.net/guanshengg/article/details/126280758