代理的一个例子

这个例子要解决为一个Vector对象提供一个代理对象。当你访问Vector的任何方法时,在调用的前后都会分别打印出两条信息。这表明代理对象有能力截获和控制这个Vector对象。
系统仅仅需要一个新的类,称为VectorProxy类,此类需要实现InvocationHandler接口的invoke()方法.
可以看出VectorProxy类必须实现invoke()方法,因为这是InvocationHandler接口的要求,由于Vector对象实现了java.util.List接口,因此,通过调用List的方法,可以控制代理对象。

package com.java.patterns.proxy.reflect;
import java.lang.reflect.*;
import java.util.*;

public class VectorProxy implements InvocationHandler
{
 //代理对象
 private Object proxyobj;
 //构造函数
 public VectorProxy(Object obj)
 {
  this.proxyobj=obj;
 }
 //静态工厂方法
 public static Object factory(Object obj)
 {
  Class cls = obj.getClass();
  return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new VectorProxy(obj));
 }
 //代理对象的处理函数(实现InvocationHandler接口函数)
 /**
  *proxy代理对象,这里是proxyobj
  *method代理对象执行被代理对象的函数,相当于C++中的函数指针,但Method是个封装函数指针的类,我个人这么认为的^_^
  *args是执行函数method的参数数组
  */
 public Object invoke(Object proxy,Method method,Object[] args) throws Throwable
 {
  System.out.println("调用"+method.toString()+"之前"); 
  if(args!=null)
  {
   System.out.println("调用参数:");
   for(int i=0;i<args.length;i++)
   {
    System.out.println(args[i]+"/");
   }
  }
  Object o = method.invoke(proxyobj,args);
  System.out.println("调用"+method.toString()+"之后");
  System.out.println("___________________________________________________");
  return o;
  
 }
 public static void main(String[] args)
 {
  List v = null;
  //List是Vector实现的一个接口,所以可以用这个接口指向实际的代理对象,详细问题查Jdk去,
  //我一般很负责任的,只是有时候偷懒
  v = (List)factory(new Vector());
  v.add("Hello");
  v.add("ByeBye");
  v.add(1,"Welcome");
  v.remove(0);
  v.remove(1);
 }
}
也就是说代理对象截获了对Vector对象的所有调用,再调用传递给Vector之前和之后,代理对象具有采取合适操作的灵活性,虽然这里代理对象采取的操作不过就是打印出两种信息。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值