package com.DynamicProxy3; /** * 動態代理: 抽象角色(公共接口) * * @author DW * */ public interface DoSomething { public void working(String work); }
package com.DynamicProxy3; /** * 動態代理: 真實角色 * * @author DW * */ public class Man implements DoSomething { private String name; public Man(String name) { this.name = name; } @Override public void working(String work) { System.out.println(this.name + "在" + work); } }
package com.DynamicProxy3; /** * 動態代理: 真實角色 * * @author DW * */ public class Woman implements DoSomething { private String name; public Woman(String name) { this.name = name; } @Override public void working(String work) { System.out.println(this.name + "在" + work); } }
package com.DynamicProxy3; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 動態代理: 代理角色 * * @author DW * */ public class People implements InvocationHandler { private Object object; public People(Object object) { this.object = object; } /** * 動態接受不同的真實角色對象 * @param object */ public void setObject(Object object) { this.object = object; } public static Object factory(Object object) { InvocationHandler handler = new People(object); // 動態生成一個代理 return Proxy.newProxyInstance(object.getClass().getClassLoader(), // 真實對象的類加載器 object.getClass().getInterfaces(), // 真實對象實現的所有接口(數組) handler // 代理對象, ); } /** * 代理角色類實現了InvocationHandler接口的invoke方法, 當factory方法每次調用后, 都動態生成一個代理實例, * 當該代理實例引用在外部調用working()方法時, 實際都是在調用本方法; 並通過java底層傳參利用反射機制, 將該代 * 理角色接收的真實角色的working方法通過參數2傳遞進來, working方法的參數則通過參數3傳遞進來... * */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 實際形態:handler引用指向的代理角色對象接受的真實用戶的working方法 return method.invoke(this.object, args); } }
package com.DynamicProxy3; /** * 動態代理: 測試 * * @author DW * */ public class DynamicProxyTest { public static void main(String[] args) { DoSomething doSomething = (DoSomething)People.factory(new Man("張三")); doSomething.working("狩獵"); // 張三在狩獵 doSomething = (DoSomething)People.factory(new Man("李四")); doSomething.working("劈柴"); // 李四在劈柴 doSomething = (DoSomething)People.factory(new Woman("翠花")); doSomething.working("做酸菜"); // 翠花在做酸菜 } }