JDK 动态代理机制

首先定义一个抽象接口,JDK代理要求目标对象必须实现接口。(个人觉得这个应该是基于接口编程)
以UserManager接口为例。在里面我们定义了一个add方法。

code:

package com.kangdy.test;

public interface UserManager {
 public void addUser(String  userName);
}


接下来定义接口实现类。为了简洁只是向客户端输出一句话。
code:

package com.kangdy.test;

public class UserManagerImpl implements UserManager {

 public void addUser(String userName) {
  System.out.println("用户 : "+userName+" 添加成功");
 }

}


下面是我们的动态代理类。代理类实现了java.lang.reflect.InvocationHandler接口。
动态代理机制用到jave反射方面的api,反射方面的资料往上很多的。不清楚的可以先查阅读一下
code:

package com.kangdy.test;

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

public class JDKStaticProxy implements InvocationHandler{
 //目标对象索引
 private Object targetObject;
 
 /*
  * 通过构造方法引入目标对象
  */
 public JDKStaticProxy(Object targetObject){
  this.targetObject = targetObject;
 }
 
 /*
  * 创建代理对象
  */
 public Object createProxyObject(){
  Object proxyObject = Proxy.newProxyInstance(
    this.targetObject.getClass().getClassLoader(),
    this.targetObject.getClass().getInterfaces(), this);
  return proxyObject;
 }
 
 /*
  * proxyObject:代理对象
  * method: 被拦截到的目标对象的method
  * args: 被拦截到的目标对象的method的参数
  * (non-Javadoc)
  * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
  */
 public Object invoke(Object proxyObject, Method method, Object[] args)
   throws Throwable {
  //添加业务逻辑
  busniessLogic();
  
  //代理运行目标对象的method
  Object result = method.invoke(this.targetObject, args);
  return result;
 }
 
 /*
  * 添加业务逻辑,这里只是简单打印一句话。
  */
 private void busniessLogic(){
  System.out.println("这是代理方法");
 }
 
}

代理类我添加很多注释。应该很清楚了。这里我简单说一下流程:当代理对象被调用的时候先会执行invoke方法,在此方法里面我们可添加
自己的业务逻辑代码,然后才会执行目标对象的真实方法:method.invoke(this.targetObject, args);目标对象方法可能会有返回值,在这
里当存在返回值的时候我们返回一个Object.

下面代码是客户端调用和调用结果:

code:

package com.kangdy.test;

import org.junit.Test;

public class TestJDKStaticProxy {
 
 @Test public void testJDKStaticProxy(){
  JDKStaticProxy proxy = new JDKStaticProxy(new UserManagerImpl());
     UserManager userManager = (UserManager) proxy.createProxyObject();
  userManager.addUser("张三");
  
 }
}

控制台输出结果:
 
这是代理方法
用户 : 张三 添加成功

posted on 2009-11-05 16:06 AK47 阅读(980) 评论(0)  编辑  收藏 所属分类: 设计模式


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜