<JAVA与模式>之动态代理

原文:http://www.jb51.net/article/79565.htm

参考:http://www.jb51.net/article/84659.htm

本文针对java动态代理进行知识点整理,具体内容如下

一. JAVA的动态代理(比较官方说法)
  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。  代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提  供特定的服务。
  按照代理的创建时期,代理类可以分为两种。
  静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
  动态代理:在程序运行时,运用反射机制动态创建而成。

二. 动态代理实现

  java.lang.reflect.Proxy,
  Proxy 提供用于创建动态代理类和实例的静态方法.
  newProxyInstance()
  返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

 2.1. Dao接口(提供模拟数据访问层接口)

?
1
2
3
4
5
6
7
8
package javaproxy;
/*
  * 定义一个数据访问层接口
  */
public interface Dao {
  //模拟数据保存
public void save();
}

2.2. DaoImpl类实现类

?
1
2
3
4
5
6
7
8
9
10
11
package javaproxy;
  
public class DaoImpl implements Dao{
  
  @Override
  public void save() {
   System.out.println( "执行一个保存方法。。。。。。。。。。。。" );
    
  }
  
}

2.3. 代理处理类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package javaproxy;
  
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
  
public class DaoHandler implements InvocationHandler{
  private Object obj;
public DaoHandler(Object obj) {
  this .obj=obj;
}
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    System.out.println( "do something before method" ); //这里模拟AOP的前置方法
    Object ret = method.invoke( this .obj, args);
    System.out.println( "do something after method" ); //这里模拟AOP的后置方法
    return ret;
  }
  
}

 2.4. client调用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package javaproxy;
  
import java.lang.reflect.Proxy;
  
public class Client {
    
   public static void main(String[] args) {
    // 元对象(被代理对象)
    DaoImpl daoImpl = new DaoImpl();
    
    // 业务代理类
    DaoHandler daoHandler= new DaoHandler(daoImpl);
    
    Dao dao=(Dao) Proxy.newProxyInstance(daoImpl
     .getClass().getClassLoader(), daoImpl.getClass()
     .getInterfaces(), daoHandler);
    
    dao.save();
  
  }
}

2. 5. 结果

3. 模拟Mybatis中的代理实现

3.1. MapperProxy类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package javaproxy;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
public class MapperProxy implements InvocationHandler {
  @SuppressWarnings ( "unchecked" )
  /*
   * 这里通过静态方法得到实现类的对象
   *
   * @param:接口
   *
   * @param:用sqlsession执行方法
   *
   * @return: 返回代理对像
   */
  public static <T> T newMapperProxy(Class<T> mapperInterface,
    Object sqlSession) {
   ClassLoader classLoader = mapperInterface.getClassLoader();
   Class<?>[] interfaces = new Class[] { mapperInterface };
   MapperProxy proxy = new MapperProxy();
   return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
  }
 
  /*
   * (non-Javadoc)
   *
   * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
   * java.lang.reflect.Method, java.lang.Object[])
   *
   * @param:代理对象
   *
   * @param:方法通过方法名字找到对应的方法
   *
   * @param:通过方法传入对象找到对应的传递参数映射
   *
   * @return:返回执行后的参数对象
   */
  public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
   // 这里通过方法名字以及参数通过解析对应的mapper来执行对应的操作
   System.out.println( "在这里执行实际方法" );
   return null ;
  }
 
}

3.2. Client

?
1
2
3
4
5
6
7
8
9
10
11
12
13
package javaproxy;
  
import java.lang.reflect.Proxy;
  
public class Client {
    
   public static void main(String[] args) {
    
   Dao dao=MapperProxy.newMapperProxy(Dao. class , null );
   dao.save();
  
  }
}

 3.3. 结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值