實現代理的一個小例子

我講的這個例子對實現數據庫連接池很有幫助!

首先生成一個接口Cons.java

package proxytest;

public interface Cons
{
 void close();
 void open();
}

下面是實現Cons的類ConsImpl.java:

package proxytest;

public class ConsImpl implements Cons
{
     public void close()
    {
         System.out.println("調用ConsImpl實現的close方法!");
     }
 
     public void open()
    {
        System.out.println("調用ConsImpl實現的open方法!");
    }

}

我們現在要屏蔽掉close()方法!就要生成一個代理ConsProxy.java:

package proxytest;

import java.lang.reflect.*;

public class ConsProxy implements InvocationHandler
{
 public ConsProxy(Cons _cons)
 {
  this.cons = _cons;
 }
 
 public Cons getCons()   //生成代理對象!
 {
  Cons cons1 = (Cons)Proxy.newProxyInstance(
       cons.getClass().getClassLoader(),
       cons.getClass().getInterfaces(),this);
  return cons1;
 }
 
 public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
 {
  Object obj = null;
  //判斷是否調用了close的方法,如果調用close方法就調用你想調用的別的方法!
  if(CLOSE_METHOD_NAME.equals(m.getName()))
   close();
  else
   obj = m.invoke(cons, args);
  return obj;
 }
 
 public void close()
 {
  System.out.println("調用代理中的close方法!");
 }
 

 private Cons cons = null;
 private final static String CLOSE_METHOD_NAME = "close";
}

生成代理之後我們就可以來測試了,測試代碼ProxyTest.java

package proxytest;

public class ProxyTest
{
 
 public static void main(String args[])
 {
  Cons cons = new ConsImpl();
  
  ConsProxy proxy = new ConsProxy(cons); 
  
  Cons cons1 = proxy.getCons();  //獲取經過代理的對象
  
  cons.close();    //這是沒有經過代理的Cons對象!
  
  cons1.close();   //這是經過代理的對象
 }

}

 

執行結果:

調用ConsImpl實現的close方法!
調用代理中的close方法!

就這麼簡單,希望對大家有幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章