zoukankan      html  css  js  c++  java
  • 动态代理详解(一)应用示例

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class MyInvocationHandler implements InvocationHandler{
        // 目标对象
        private Object target;
    
        /**
         * 构造方法
         * @param target 目标对象
         */
        public MyInvocationHandler(Object target) {
            super();
            this.target = target;
        }
    
    
        /**
         * 执行目标对象的方法
         */
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
            // 在目标对象的方法执行之前简单的打印一下
            System.out.println("--------before-------");
    
            // 执行目标对象的方法
            Object result = method.invoke(target, args);
    
            // 在目标对象的方法执行之后简单的打印一下
            System.out.println("--------after--------");
    
            return result;
        }
    
        /**
         * 获取目标对象的代理对象
         * @return 代理对象
         */
        public Object getProxy() {
            return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                    target.getClass().getInterfaces(), this);
        }
    }
    public interface UserService {
        /**
         * 目标方法
         */
        public abstract void add();
    }
    public class UserServiceImpl implements UserService{
        public void add() {
            System.out.println("-------add------");
        }
    }
    import org.junit.Test;
    
    public class ProxyTest {
        @Test
        public void testProxy() throws Throwable {
            // 实例化目标对象
            UserService userService = new UserServiceImpl();
    
            // 实例化InvocationHandler
            MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);
    
            // 根据目标对象生成代理对象
            UserService proxy = (UserService) invocationHandler.getProxy();
    
            // 调用代理对象的方法
            proxy.add();
    
        }
    }

    运行结果:

    ------------------before------------------
    --------------------add---------------
    -------------------after------------------
  • 相关阅读:
    解析网页源码方式
    vue踩坑--细节决定成败
    fallowing-travelvue
    学会不怕
    eslint代码规范检测
    三次握手+四次挥手
    小白的学习笔记
    es6数组
    css知识整理
    JavaScript之事件循环,宏任务与微任务
  • 原文地址:https://www.cnblogs.com/zhimingxin/p/7509668.html
Copyright © 2011-2022 走看看