明星类型:
package dynamic_proxy_mode; /** * 明星类型 */ public interface Star { /** * #面谈 */ // void confer(); /** * #签合同 */ // void signContract(); /** * #订票 */ // void bookTicket(); /** * 唱歌 */ void sing(); /** * #收款 */ // void collectMoney(); }
具体明星:
package dynamic_proxy_mode; /** * 具体明星, 某某明星, 明星实现类, 真实明星 */ public class RealStar implements Star { /** * #面谈 */ // @Override // public void confer() { // System.out.println("真实角色面谈!"); // } /** * #签合同 */ // @Override // public void signContract() { // System.out.println("真实角色签合同!"); // } /** * #订票 */ // @Override // public void bookTicket() { // System.out.println("真实角色订票!"); // } /** * 唱歌 */ @Override public void sing() { System.out.println("真实角色(周杰伦本人)唱歌!"); } /** * #收款 */ // @Override // public void collectMoney() { // System.out.println("真实角色收款!"); // } }
类型对象处理类:
package dynamic_proxy_mode; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 类型对象, 接口对象处理类 */ public class StarHandler implements InvocationHandler{ /** * 持有真实对象的引用 */ private Star realStar; /** * 构造器(传入真实对象) */ public StarHandler(Star realStar) { this.realStar = realStar; } /** * 代理类的所有方法, 都来这报道 * 核心方法, 所有流程控制都在这里处理, 需要用到其它方法请在这里提供 * 参数: proxy代理对象, method正在调用的方法, args方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object object = null; System.out.println("真正的方法唱歌执行前!"); System.out.println("经纪人: 面谈, 签合同, 订票!");//以打印模拟业务处理 //核心方法之外的, 此处可以做到统一的流程控制, 比静态代理更简单了 if (method.getName().equals("sing")) { object = method.invoke(realStar, args);//激活并调用真实对象的方法 //void sing(); object是返回值此处为null, 客户端参数也不用传, 但此处args也要写上 } System.out.println("真正的方法唱歌执行后!"); System.out.println("经纪人: 收款!"); return object; } }
测试类:
package dynamic_proxy_mode; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { //创建真实对象 Star realStar = new RealStar(); //创建类型对象或接口对象的处理对象 StarHandler handler = new StarHandler(realStar); //创建代理类对象, 需要传入(默认的系统类加载器, 类型对象, 处理对象) Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler); proxy.sing(); } }
执行结果:
真正的方法唱歌执行前! 经纪人: 面谈, 签合同, 订票! 真实角色(周杰伦本人)唱歌! 真正的方法唱歌执行后! 经纪人: 收款!
谢谢声明出处!
转自: http://www.cnblogs.com/gscq073240/articles/7118394.html