1. 程式人生 > >Java反射機制——動態代理的理解與程式碼體現!

Java反射機制——動態代理的理解與程式碼體現!

package com.ITcore.cn;
/**
 * @author 維宇——鮀城小帥
 *  作於:2018-10-9
 * 別代理物件
 * */
public interface Father {
	//購買
	public void buy();
}

 

package com.ITcore.cn;
/**
 * 代理人,實現被代理物件介面
 * */
public class Sister implements Father {

	@Override
	public void buy() {
		/**
		 * 購買海鮮產品
		 * */
		System.out.println("買帶魚、龍蝦、海蟹,今晚吃海鮮!哈哈!");
		
	}

}
package com.ITcore.cn;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class FatherProxy {
	
	public static void main(String[] args) {
		
		// jdk動態代理,可以對目標物件進行增強操作。
		// Jdk動態代理其實是根據目標物件的所有介面,來自動的生成一個實現類
		// 代理物件,其實實現了目標物件的所有介面
		Sister sister =	new Sister();
		/**
		 * new建立= Proxy代理= Instance例項<br/>
		 * 建立代理物件
		 * 第一個引數是目標物件的類載入器<br/>
		 * 第二個引數是目標物件實現的所有介面<br/>
		 * 第三個引數是InvocationHandler介面,可以攔截每個目標方法的執行。invoke方法
		 */
		/**
		 * 在這裡,sister代表father去買海鮮,會由代理人sister生成一個購買海鮮行為的執行方法,
		 * 在執行前會呼叫代理人的類載入器(確定了代理的身份和執行)和
		 * 呼叫所有介面(確定了代理人執行代理的所有行為或者說是方法是繼承或實現自誰),
		 * 最後的new 是正在執行的代理行為
		 * 並根據條件A確定執行,或根據條件B不執行
		 * */
		Father proxy = (Father)Proxy.newProxyInstance(sister.getClass().getClassLoader(), sister.getClass().getInterfaces(),new InvocationHandler() {
			/**
			 * 第一個引數是proxy代理物件<br/>
			 * 第二個引數是目標方法的反射物件<br/>
			 * 第三個引數是,目標方法執行時傳遞進來的引數
			 */
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			
				/*
				// TODO Auto-generated method stub
				//條件A
				System.out.println("前有富足,在來點石斑魚還有對蝦!");
				//執行代理並返回
				return method.invoke(sister, args);*/
				
				//條件B
				System.out.println("老爸給的錢不夠,不買了!剛好街角口紅上新款,去刷一波先!");
				
				Object result = null;
				//不執行代理
				return result;
			}
		});
		
	}
}