Java中的代理

     今天看到了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------

你可能感兴趣的:(java,DAO,spring,object,Class,insert)