我讲的这个例子对实现数据库连接池很有帮助!
首先生成一个接口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方法!
就这么简单,希望对大家有帮助!