java动态代理

定义动态代理类DynamicProxy

 

package com.zte.adc.common;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxy implements InvocationHandler {

 private Object object;

 // 绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
 // Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
 public Object bindRelation(Object object) {
  this.object = object;
  return Proxy.newProxyInstance(object.getClass().getClassLoader(),
    object.getClass().getInterfaces(), this);
 }

 // 拦截关联的这个实现类的方法被调用时将被执行,只要是代理的类执行方法 首先经过invoke方法
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  if ("queryForList".equals(method.getName()) && args.length == 4) {
   args[2] = (Integer) args[2] - 1;

  }
  Object result = method.invoke(object, args);
  return result;
 }

}

获得动态代理的代理对象 注意动态代理返回的对象必须是被代理对象的接口

 

 public SqlMapClientTemplate sqlTemplate1 = this.getSqlMapClientTemplate();
 public SqlMapClientOperations sqlTemplate=null;//这里1
 private DynamicProxy dp = new DynamicProxy();
 {
  sqlTemplate= (SqlMapClientOperations)dp.bindRelation(sqlTemplate1);
 }
 
 public BaseSqlMapDao() {

 }

如果在 “这里1”中用的不是SqlMapClientTemplate 的借口 而是直接用的SqlMapClientTemplate  那么

就会抛出异常

 

动态代理的原理就是通过动态代理类DynamicProxy 生成了一个新的对象 Proxy对象

该新对象继承的接口就是原对象的接口,产生的新对象并不是源对象的实例 而是产生的代理对象的实例

posted @ 2010-01-27 15:55  饺子吃遍天  阅读(60)  评论(0编辑  收藏  举报