java的動態代理(AOP)

來源:互聯網
上載者:User

代理分為兩種:一種是實現介面的java動態代理,一種為不實現介面的代理是基於CGLIB實現的。

 

 Proxy提供了用於建立動態代理類和動態代理對象的 靜態方法,它也是所有動態代理的父類,

下面通過簡單的 執行個體介紹Dynamic Proxy:

Dog:

public interface Dog {
 public void info();
 public void run();
}

 

Dog的實作類別:

public class DogImpl implements Dog{

 public void info() {
  
  System.out.println("我是一隻獵狗");
 }

 public void run() {
  System.out.println("我跑的非常快");
  
 }
}

 

public class DogUtil {

 public void method1(){
  System.out.println("==========類比第一個通用方法==========");
 }
 public void method2(){
  System.out.println("==========類比第二個通用方法==========");
 }
}

 

/**
 * 該類是一個InvocationHandler的實作類別,該類的invoke方法將作為代理對象的方法實現
 */
public class MyInvocationHandler implements InvocationHandler {

 /**需要被代理的對象*/
 private Object target;
 
 public void setTarget(Object target) {
  this.target = target;
 }

 /**執行動態代理對象的所有方法,都會被替換成執行如下的invoke方法*/
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  DogUtil dogUtil = new DogUtil();
  dogUtil.method1();
  
  Object result = method.invoke(target, args);
  
  dogUtil.method2();
  return result;
 }

}

 

/**
 * 專為指定的target產生動態代理執行個體
 */
public class MyProxyFactory {
 //注意Proxy提供了兩種方法來建立動態代理類和動態代理執行個體,如:
 
 public static Object getProxyInstance(Object target) {
  MyInvocationHandler handler = new MyInvocationHandler();
  handler.setTarget(target);
  /*建立並返回動態代理*/
  return Proxy.newProxyInstance(target.getClass().getClassLoader(),
    target.getClass().getInterfaces(), handler);
 }
 public static Object getProxyClass(Object target) throws Exception {
  MyInvocationHandler handler = new MyInvocationHandler();
  handler.setTarget(target);
  /*建立並返回動態代理*/
  Class clazz = Proxy.getProxyClass(target.getClass().getClassLoader(), target.getClass().getInterfaces());
  Constructor con = clazz.getConstructor(new Class[]{InvocationHandler.class});
  return con.newInstance(new Object[]{handler});
 }
}

 

測試:

public class Test {

 public static void main(String[] args) throws Exception {
  Dog target = new DogImpl();
  //Dog dog = (Dog)MyProxyFactory.getProxyClass(target);
  Dog dog = (Dog)MyProxyFactory.getProxyInstance(target);
  dog.info();
  dog.run();
 }
}

 

輸出結果:

==========類比第一個通用方法==========
我是一隻獵狗
==========類比第二個通用方法==========
==========類比第一個通用方法==========
我跑的非常快
==========類比第二個通用方法==========

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.