设计模式研究--Proxy Model

博客给出一个动态代理的例子,核心是JDK中动态代理,这也是Spring的AOP实现的核心原理。要实现动态代理,需实现InvocationHandler接口并覆写invoke方法,可在被代理类方法调用前后做自定义操作,还提醒了转型可能出现的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个动态代理的例子,今天时间比较晚了,抽时间我会做一下分析.

package javapatterns;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Vector;
/**
 *  Proxy Model 的研究
 * <p>Title:VectorProxy.java</p>
 * <p>Description:</p>
 * <p>Copyright:Copyright (c) 2004 DSII,Inc</p>
 * <p>Company:DSII,Inc</p>
 * @author Morgan 2004-11-8
 * @version 1.0
 */
public class VectorProxy implements InvocationHandler {
 private Object proxyobj;

 public VectorProxy(Object obj) {
  proxyobj = obj;
 }

 public static Object factory(Object obj) {
  Class cls = obj.getClass();

  return Proxy.newProxyInstance(
   cls.getClassLoader(),
   cls.getInterfaces(),
   new VectorProxy(obj));
 }

 public Object invoke(Object proxy, Method method, Object[] args)
  throws Throwable {
  System.out.println("before calling " + method);

  if (args != null) {
   for (int i = 0; i < args.length; i++) {
    System.out.println(args[i] + "");
   }
  }
  Object o = method.invoke(proxyobj, args);

  System.out.println("after calling " + method);
  return o;
 }

 public static void main(String[] args) {
  List v = null;
  v = (List) factory(new Vector(10));
  v.add("New");
  v.add("York");
 }
}

运行结果:
------------------------------------------

before calling public abstract boolean java.util.List.add(java.lang.Object)
New
after calling public abstract boolean java.util.List.add(java.lang.Object)
before calling public abstract boolean java.util.List.add(java.lang.Object)
York
after calling public abstract boolean java.util.List.add(java.lang.Object)

-----------------------------------------

      上面这个例子,核心实现实际就是JDK中动态代理.这也是Spring的AOP中实现的核心原理所在(当然还有CGLIB),明白了这个你也就能很快理解Spring的AOP中实现原理.
      从上面可以看到, 要实现动态代理,必须实现java.lang.reflect.InvocationHandler接口,同时覆写掉InvocationHandler接口中的public Object invoke(Object proxy, Method method, Object[] args)方法.那么只要调用被代理类的方法,就会自动执行invoke()方法.
       这么做有什么用呢?  
-----------------------------------------
  System.out.println("before calling " + method);
  Object o = method.invoke(proxyobj, args);
  System.out.println("after calling " + method);
-------------------------------------------

      你应该已经看到了吧,我们可以在被代理类方法调用的前后,我们可以做自己想做的事情,比如对传入的参数控制,Log信息等等(Spring 中事务管理也是这样的)..........
      在此,我还要提醒大家的是,如果上面的代码改成
           List v = (Vector) factory(new Vector(10));

      就会抛出ClassCastException, 向下转型出错了!  
       Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),new VectorProxy(obj));
     看见cls.getInterfaces()没有,它返回的实际是cls的接口实例,而例子中我们传递的是proxyobj是个Vector,那么它的一个接口就是List.所以转成List是可以的,Vector就会出错了.........

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值