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();
        }
    }
    

      

  • 相关阅读:
    Delphi TCXTreeList的一些操作
    Authentication failure. Retrying 彻底解决vagrant up时警告
    Linux查看mysql 安装路径和运行路径
    和重复搭建开发环境说 Bye Bye 之Vagrant
    怎样查看MySql数据库物理文件存放位置
    10分钟彻底理解Redis持久化和主从复制
    胡子决定编程语言运势
    总结: asp.net页面间数据传递(转)
    利用System.IO中的Directory类对目录进行基本操作
    SQL中读出表中字段
  • 原文地址:https://www.cnblogs.com/564085446java/p/5192182.html
Copyright © 2011-2022 走看看