天天看點

Java的動态代理

Java的動态代理主要是指位于java.lang.reflect包下的Proxy類,在使用過程中會用到同一個包下的InvocationHandler接口。

    loader是目标類的類加載器,

  interfaces是目标類實作的接口(并不一定是它實作的所有接口,用Class<?>[]類型表示就可以了),

  h是InvocationHandler類型的一個對象。

   proxy是代理對象,

   method是目标方法,

   args是目标方法的參數清單。

所謂動态代理其實就是這樣的一種對象:它是在程式運作時動态生成的對象,在生成它時你必須提供一組接口給它,然後該對象就宣稱它實作了這些接口。你當然可以把該對象當作這些接口中的任何一個來用。當然,這其實就是一個代理對象,它不會替你作實質性的工作,在生成它的執行個體時你必須提供一個handler,由它接管實際的工作。

接口:

public interface StudentDao { 

  public void test1(); 

  public void test2(); 

  public void test3(); 

  public void test4(); 

}

public interface StudentDao2 { 

  public void t(); 

目标類:

public class StudentDaoImpl implements StudentDao ,StudentDao2{ 

    //對接口方法的實作 

Handler:

public class MyInvocationHandler implements InvocationHandler { 

  private Object target; 

  private List<String> matchNames=null; //用來控制對目标類的那些方法做功能上的改變

  public MyInvocationHandler() { 

  } 

  public MyInvocationHandler(Object target) { 

    this.target = target; 

    matchNames=new ArrayList<String>(); 

    matchNames.add("test1"); 

    matchNames.add("test2"); 

    matchNames.add("test3");     

  @Override 

  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 

    String methodName=method.getName(); 

    if(matchNames.contains(methodName)){ 

      System.out.println("========begin transaction========="); 

    } 

    Object ret = method.invoke(target, args); 

      System.out.println("========end transaction=========="); 

    return ret; 

測試類:

  public static void main(String[] args) { 

    StudentDaoImpl dao=new StudentDaoImpl(); 

    MyInvocationHandler handler=new MyInvocationHandler(dao); 

    StudentDao proxy=(StudentDao)Proxy.newProxyInstance(

                                        dao.getClass().getClassLoader(),

                                        new Class<?>[]{StudentDao.class},

                                        handler); 

    proxy.test1(); 

    proxy.test2(); 

    proxy.test3(); 

    proxy.test4(); 

運作結果:

========begin transaction=========

==========目标方法:test1()============

========end transaction==========

==========目标方法:test2()============

==========目标方法:test3()============

==========目标方法:test4()============

     本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/245254,如需轉載請自行聯系原作者