• java的动态代理设计模式


    代码实现:

    package com.lky.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class DynamicProxy implements InvocationHandler {
    
        private Object obj;//被调用的目标对象
    
        public DynamicProxy(Object obj) {
            this.obj = obj;
        }
    
        /**
        * @Title: invoke
         @param arg0  
         @param arg1  被调用目标对象的方法
         @param arg2  被调用目标对象方法的参数
         @return
         @throws Throwable    参数
        * @return    返回类型
         */
        @Override
        public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
            Object result = null;
            doBefore();
            result = arg1.invoke(obj, arg2);
            doAfter();
            return result;
        }
    
        //工厂模式生成动态动态代理
        public static Object proxyFactory(Object object) {
            Class<? extends Object> cls = object.getClass();
            return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), new DynamicProxy(object));
        }
    
        public void doBefore() {
            System.out.println("初始化。。。。。。。。。");
        }
    
        public void doAfter() {
            System.out.println("日志处理。。。。。。。。。");
        }
    }

    测试代码:

    package com.lky.proxy;
    
    import org.junit.Test;
    
    public class testProxy {
        
        @Test
        public void test(){
            Cat cat=new Cat();
            Animal animal=(Animal)DynamicProxy.proxyFactory(cat);
            animal.eat();
            System.out.println("-------------------");
            animal.sleep();
            System.out.println("-------------------");
            
            Car car=new Car();
            Vehicle vehicle=(Vehicle)DynamicProxy.proxyFactory(car);
            vehicle.run();
            System.out.println("-------------------");
            vehicle.stop();
        }
        
    }

    注:

    1. 抽象角色(抽象类或接口),真实角色(真正实现了业务逻辑接口),代理角色(自己并未实现业务逻辑接口,而是调用真实角色来实现),这里接口和接口的实现没有列举,只列举了动态代理生成
    2. 一个类要能处理动态代理必须实现InvocationHandler 接口
    3. 动态代理的获取需要Proxy的newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法来生成
    4. invoke(Object proxy, Method method, Object[] args) 方法则是由JVM在运行时动态调用
  • 相关阅读:
    Linux Kernel 2:用户空间的初始化
    Linux Kernel系列一:开篇和Kernel启动概要
    谢宝友:会说话的Linux内核
    如何给USB移动硬盘格式化分区
    AVR单片机最小系统 基本硬件线路与分析
    Altium Designer 基本封装
    AVR单片机命名规则
    LynxFly科研小四轴横空出世,开源,F4,WIFI --(转)
    四轴自适应控制算法的一些尝试开源我的山猫飞控和梯度在线辨识自适应等算法—(转)
    我的四轴专用PID参数整定方法及原理---超长文慎入(转)
  • 原文地址:https://www.cnblogs.com/dmir/p/4875981.html
Copyright © 2020-2023  润新知