程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 靜態代理和動態代理教程

Java 靜態代理和動態代理教程

編輯:關於JAVA
 

代理模式主要有兩種:靜態代理和動態代理

< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

Java代碼 < xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />

 

1 > 接口

package com.proxy;

 

/**

* 接口

*

*/

public interface ITask {

public String task(String name);

}

 

2 > 實理類

 

package com.proxy;

 

/**

* 實現類

*

*/

public class TaskImpl implements ITask {

 

public String task(String name) {

System.out.println("hello "+name);

return "hello "+name;

}

 

}

一. 靜態代理:

 

3 > 靜態代理類

package com.proxy;

 

/**

* 靜態理,就是實理接品中的所有方法,

* 跟據傳入的實理類,來調用實理類中的方法

*

*/

public class StaticProxy implements ITask{

private ITask task;

 

public StaticProxy(ITask task){

this.task = task;

}

 

/*

* 實現接口中的方法,但是用傳入的實理類來搞用自己的方法

*/

public String task(String name) {

return task.task(name);

}

 

 

}

4 > 調用靜態代理

package com.proxy.test;

 

import com.proxy.ITask;

import com.proxy.StaticProxy;

import com.proxy.TaskImpl;

 

/**

* 測試靜態理

* @author Administrator

*

*/

public class TestStaticProxy {

 

public static void main(String[] args){

ITask proxy = new StaticProxy(new TaskImpl());

proxy.task("張三");

}

}

 

二.動態代理:

5 > 動態代理類

 

package com.proxy.dy;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

 

/**

* 動態代理類只能代理接口,代理類都需要實現InvocationHandler類,實現invoke方法。

* 該invoke方法就是調用被代理接口的所有方法時需要調用的,該invoke方法返回的值是被代理接口的一個實現類

* @author Administrator

*

*/

public class DynamicProxy implements InvocationHandler {

private Object object;

 

/*

* 返回一個代理類

* @param ob

* @return

*/

public Object bind(Object ob){

this.object = ob;

return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(), this);

}

 

/*

* 對這個代理類中所有方法攔截

*/

public Object invoke(Object arg0, Method arg1, Object[] arg2)

throws Throwable {

Object result = null;

 

log("method start........");

result = arg1.invoke(object, arg2);

log("method end .........");

 

return result;

}

 

/**

* 日志輸出方法

* @param msg

*/

public void log(String msg){

System.out.println(msg);

}

 

}

 

 

6 > 調用動態代理

 

package com.proxy.test;

 

import com.proxy.ITask;

import com.proxy.TaskImpl;

import com.proxy.dy.DynamicProxy;

 

/**

* 測試動態代理

* @author Administrator

*

*/

public class TestDynamicProxy {

 

/**

* @param args

*/

public static void main(String[] args) {

DynamicProxy dynamicProxy = new DynamicProxy();

ITask task = (ITask)dynamicProxy.bind(new TaskImpl());

task.task("李四");

 

}

 

}

總結:這其實是AOP的最底層實現,AOP的的好處就是用到了代理,把各種業務邏輯分離開來了,不管是核心要處理的還是作為輔助功能(或者測試)的業務邏輯,比如日志作為一個切面可以去測試每個方法是否都執行了,用AOP就不需要去改動任何核心業務,如果不要了,就不指定Pointcut就可以了(關於AOP的各種術語可以參考 spring reference),這應該算是一種思想的轉變。

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved