• 动态代理(java模拟生活中的代理)


    1什么是代理?

    代理指:某些场景下对象会找一个代理对象,来辅助自己完成一些工作:如歌星(经纪人),买房的人(房产中介);

    代理主要是对对象的行为额外做一些辅助操作

    2Java中实现动态代理的步骤是什么样的?

    必须存在接口

    被代理对象需要实现接口

    使用Porxy类提供的方法,得到对象的代理对象

    public static Object newProxyInstance(ClassLoader  loader ,Class[]  interface,InvocationHandler h)

    为被代理对象返回一个代理对象

    参数1:类加载器,加载代理类,产生代理对象

    参数2:真实业务对象的接口(被代理的方法交给代理对象)

    参数3:代理的核心处理程序

    模拟一些明星的代理,用java实现

    创建技能接口

    1. package 动态代理;
    2. /**
    3. * 技能接口
    4. */
    5. public interface Skill {
    6. void sing();//唱歌
    7. void dance(); //跳舞
    8. }

    创建明星类

    1. package 动态代理;
    2. /**
    3. * 明星类
    4. */
    5. public class Star implements Skill{
    6. private String name;
    7. public Star(String name) {
    8. this.name=name;
    9. }
    10. @Override
    11. public void sing() {
    12. // TODO Auto-generated method stub
    13. System.out.println(name+"正在唱歌");
    14. }
    15. @Override
    16. public void dance() {
    17. // TODO Auto-generated method stub
    18. System.out.println(name+"正在跳舞");
    19. }
    20. }

    创建代理方法类

    1. package 动态代理;
    2. import java.lang.reflect.InvocationHandler;
    3. import java.lang.reflect.Method;
    4. import java.lang.reflect.Proxy;
    5. public class SkillPorxy {
    6. public static Skill getProxy(Star object) {
    7. //生成一个代理对象
    8. return (Skill) Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),new InvocationHandler() {
    9. @Override
    10. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    11. // method是正在调用的方法, args 为参数
    12. System.out.println("收首付款。。。。。。。。。");
    13. Object rs= method.invoke(object, args);
    14. System.out.println("收尾款。。。。。。。");
    15. return rs;
    16. }
    17. });
    18. }
    19. }

    测试一下

    1. package 动态代理;
    2. public class Test {
    3. public static void main(String[] args) {
    4. //创建个明星对象
    5. Star s1=new Star("周杰伦");
    6. //生成代理对象
    7. Skill ss1=SkillPorxy.getProxy(s1);
    8. ss1.sing();
    9. ss1.dance();
    10. }
    11. }

    最后输出的内容为:

    收首付款。。。。。。。。。
    周杰伦正在唱歌
    收尾款。。。。。。。
    收首付款。。。。。。。。。
    周杰伦正在跳舞
    收尾款。。。。。。。 

    3通过代理对象调用方法,执行流程是什么样的?

    先走向代理

    代理可以为方法额外做一些辅助工作

    开发真正触发对象的方法的执行

    回到代理中,由代理负责返回结果给方法的调用者

  • 相关阅读:
    RabbitMQ的常见工作模式
    SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作
    【ML07】Linear Regression using Scikit-Learn
    yolov5 损失函数代码详解
    设计模式8:代理模式-动态代理
    升级鸿蒙4.2新变化,新增 WLAN 网络自动连接开关!
    Docker全攻略(二)Docker配置国内免费registry mirror
    ArrayList知识点(面试)
    spicy(二)unit hooks
    Java中如何通过路径表达式找值:XPath和JsonPath以及SpEL详解及对比
  • 原文地址:https://blog.csdn.net/m0_64365315/article/details/126047691