• JDK 动态代理的简单理解


    动态代理

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

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

    1 /**
    2  * 接口 IHello.java
    3  */
    4 public interface IHello {
    5     void hello();
    6 }
    1 /**
    2  * 实现类 Hello.java
    3  */
    4 public class Hello implements IHello {
    5     @Override
    6     public void hello() {
    7         System.out.println("我是Hello.");
    8     }
    9 }

    通过 Proxy 实现动态代理

     1 import java.lang.reflect.InvocationHandler;
     2 import java.lang.reflect.Method;
     3 import java.lang.reflect.Proxy;
     4 
     5 import org.junit.Test;
     6 
     7 public class HelloTest {
     8     @Test
     9     public void testProxy() throws Exception {
    10         final IHello hello = new Hello();
    11 
    12         /*
    13          * proxyHello    : 代理主题角色,代理类的实例 
    14          * IHello        : 抽象主题角色,代理类和被代理类都需要实现的接口,JDK中的动态代理必须针对接口
    15          * hello         : 真实主题角色,被代理类的实例
    16          */
    17         IHello proxyHello = (IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
    18                 new Class[] { IHello.class }, new InvocationHandler() {
    19 
    20                     /*
    21                      * @param proxy : 当前代理类的一个实例; 若在invoke()方法中调用proxy的非final方法,将造成无限循环调用.
    22                      */
    23                     @Override
    24                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    25 
    26                         // 前置的业务逻辑操作
    27                         System.out.println("---开始");
    28 
    29                         // 调用被代理类的方法,传入参数args,得到返回
    30                         Object object = method.invoke(hello, args);
    31 
    32                         // 后置的业务逻辑操作
    33                         System.out.println("---结束");
    34 
    35                         return object;
    36                     }
    37                 });
    38 
    39         proxyHello.hello();
    40     }
    41 }

  • 相关阅读:
    一百个人眼中的一百种爱情
    苏迪曼杯羽毛球赛
    站点地图
    魔兽争霸微操教学(精华篇)
    (转)为winform程序注册闪屏(等待窗体)
    (转)Blend操作入门: 别站在门外偷看,快进来吧!
    (转)Asp.Net MVC的路由机制
    (转)VS2010在制作Setup项目的时候没有.NET 2.0的先决条件发行包
    (转)打造自己的LINQ Provider(上):Expression Tree揭秘
    (转)C#中的委托,匿名方法和Lambda表达式
  • 原文地址:https://www.cnblogs.com/luotaoyeah/p/3778183.html
Copyright © 2020-2023  润新知