我講的這個例子對實現數據庫連接池很有幫助!
首先生成一個接口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方法!
就這麼簡單,希望對大家有幫助!