zoukankan      html  css  js  c++  java
  • JDK动态代理的简单理解

    转载:http://www.cnblogs.com/luotaoyeah/p/3778183.html

    动态代理

      代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的相关方法,提供预处理、过滤、事后处理等服务,动态代理及通过反射机制动态实现代理机制。JDK 中的 java.lang.reflect.Proxy 类可以用来实现动态代理。

    首先,准备一个简单的接口和实现类

    /**
     * 接口 IHello.java
     */
    public interface IHello {
        void hello();
    }
    /**
     * 实现类 Hello.java
     */
    public class Hello implements IHello {
        @Override
        public void hello() {
            System.out.println("我是Hello.");
        }
    }
    

    通过 Proxy 实现动态代理

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import org.junit.Test;
    
    public class HelloTest {
        @Test
        public void testProxy() throws Exception {
            final IHello hello = new Hello();
    
            /*
             * proxyHello    : 代理主题角色,代理类的实例 
             * IHello        : 抽象主题角色,代理类和被代理类都需要实现的接口,JDK中的动态代理必须针对接口
             * hello         : 真实主题角色,被代理类的实例
             */
            IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
                    new Class[] { IHello.class }, new InvocationHandler() {
    
                        /*
                         * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.
                         */
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
                            // 前置的业务逻辑操作
                            System.out.println("---开始");
    
                            // 调用被代理类的方法,传入参数args,得到返回
                            Object object = method.invoke(hello, args);
    
                            // 后置的业务逻辑操作
                            System.out.println("---结束");
    
                            return object;
                        }
                    });
    
            proxyHello.hello();
        }
    }
    

      

  • 相关阅读:
    刷新或关闭时调用onbeforeunload
    单词换行问题
    PhpStorm提高效率的使用方法及设置
    高质量代码编写
    数组去重
    HMTL5 本地数据库
    Html5 本地存储
    php array(object) 与xml相互转换
    pwnable.kr之leg
    文件上传漏洞及其绕过
  • 原文地址:https://www.cnblogs.com/564085446java/p/5192182.html
Copyright © 2011-2022 走看看