1. 程式人生 > >JavaSE8基礎 Proxy 對接口進行動態代理 簡單示例

JavaSE8基礎 Proxy 對接口進行動態代理 簡單示例

implement over ner 會有 proxy str .get 方法 執行

禮悟:
好好學習多思考,尊師重道存感恩。葉見尋根三返一,活水清源藏於零。
虛懷若谷良心主,皓月當空自在王。願給最苦行無悔,誠勸且行且珍惜。




os :windows7 x64
jdk:jdk-8u131-windows-x64
ide:Eclipse Oxygen Release (4.7.0)



接口類:

package blog.jizuiku6;

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public interface UserDao {
	void play();
	void sleep();
}


接口實現類:

package blog.jizuiku6;

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public class UserDaoImpl implements UserDao {

	@Override
	public void play() {
		// TODO Auto-generated method stub
		System.out.println("play");
		
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("sleep");
	}

}

關鍵的類出現:

package blog.jizuiku6;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public class MyInvocationHandler implements InvocationHandler {

	private Object target = null;

	// 取消 無參構造
	private MyInvocationHandler() {
		// TODO Auto-generated constructor stub
	}

	public MyInvocationHandler(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		
		// 準備部分
		System.out.println("正在讀檔");

		// 這行代碼相當於 
		// result = target.method(agrs);
		Object result = method.invoke(target, args);
		
		// 收尾部分
		System.out.println("正在存檔");
		
		return result;
	}

}

測試類:

package blog.jizuiku6;

import java.lang.reflect.Proxy;

/**
 * 
 * 
 * @author jizuiku
 * @version V17.10.03
 */
public class Demo {
	public static void main(String[] args) {
		UserDao ud = new UserDaoImpl();
		
		MyInvocationHandler handler = new MyInvocationHandler(ud);	
		ClassLoader loader = ud.getClass().getClassLoader();
		Class[] interfaces = ud.getClass().getInterfaces();
		
		// 對接口中的方法
		UserDao proxy = (UserDao) Proxy.newProxyInstance(loader, interfaces, handler);
		 
		// 執行所有的方法時,執行前會有附加操作,執行後也會有附加操作
		// 有的時候 用到代理是: 執行前進行權限校驗,執行後進行日誌記錄
		// 而這個程序,只是進行簡單的演示。不具備實用價值
		// 如果要用在工作中的話,有成熟的框架可以使用。但萬變不離其宗,萬劍也要歸宗!Java
		proxy.play();
		proxy.sleep();
		proxy.hashCode();
			
	}
}


結果:
技術分享


Java優秀,值得學習。
學習資源:itcast和itheima視頻庫。如果您有公開的資源,可以分享給我的話,用您的資源學習也可以。
博文是觀看視頻後,融入思考寫成的。博文好,是老師講得好。博文壞,是 給最苦 沒認真。

JavaSE8基礎 Proxy 對接口進行動態代理 簡單示例