今天看到了core Java2的接口和内部类一章的结尾,结尾是关于代理类的东西,看了半天还是没弄明白。之前我看了一点Spring,Spring中有代理的内容,在一个方法调用之前,被另一个方法拦截,可以为这个方法编写Before通知,After通知,Throws通知,Around通知和Introduction通知。在网上找到了这么一点讲解Java代理的,很类似于Introduction通知。
转自:http://blog.sina.com.cn/s/blog_4a018778010003rs.html
代理模式(
Proxy)是结构模式的一种。现在当红的框架
Spring大量使用了代理模式。代理模式指在方法
a()调用前后加入代码,实现
a()调用前后的处理。为了加深理解,看下面的这个例子:
首先定义一个接口,有一个
insert方法
Package com.zq.proxy.
public interface UserDAO {
public void insert();
}
这个类是
DAO的实现
Package com.zq.proxy
public class UserDAOIpm implements UserDAO {
public void insert() {
System.out.println("do insert");
}
}
真正要实现代理的类的代码:
Package com.zq.proxy
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TxHander implements InvocationHandler {
private Object oraiginObject;
public Object bind(Object o){
this.oraiginObject = o;
return Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),this);// 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)// 在代理实例上处理方法调用并返回结果
throws Throwable {
if(arg1.getName().startsWith("insert")){//如果是以
insert开始的方法
System.out.println("-----before");//调用前执行语句
arg1.invoke(oraiginObject,arg2);//该方法被调用
System.out.println("after------");//调用后执行语句
}
return null;
}
}
Package com.zq.proxy
public class Test {
public static void main(String[] args) {
TxHander th = new TxHander();
UserDAO dao = new UserDAOIpm();
dao = (UserDAO) th.bind(dao);
dao.insert();
}
}
运行后输出:
-----before
do insert
after------