Java反射機制——動態代理的理解與程式碼體現!
阿新 • • 發佈:2018-11-13
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; } }); } }