我们需要掌握两个类的使用:
public interface InvocationHandler
InvocationHandler是通过一个代理实例调用处理程序实现的接口。
可以通过invoke方法实现对真实角色的代理访问.
通过proxy生成代理类对象,都要指定对应的处理器对象.
Object invoke(Object proxy,方法 method,Object[] args)throws Throwable
proxy -代理实例,调用的方法method代理实例的 方法实例。声明类的 方法对象将接口的方法声明,这可能是一个超接口代理接口,代理类继承的方法。args -包含在方法上通过代理实例调用的实参的值对象的数组,或 null如果接口方法不需要参数。原始类型的实参是包裹在适当的原始包装类的实例,如 java.lang.Integer或 java.lang.Boolean。1 package org.west.demo; 2 3 public interface Star { 4 //面谈 5 void confer(); 6 //签合同 7 void signContart(); 8 //订票 9 void bookTacket(); 10 //唱歌 11 void sign(); 12 //收尾款 13 void collentMoney(); 14 }
realstar
1 package org.west.demo; 2 3 public class RealStar implements Star{ 4 public void confer() { 5 6 } 7 8 public void signContart() { 9 10 } 11 12 public void bookTacket() { 13 14 } 15 16 public void sign() { 17 System.out.println("周杰伦:唱歌"); 18 } 19 20 public void collentMoney() { 21 22 } 23 }
starhandler
1 package org.west.demo; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class StarHandler implements InvocationHandler { 7 8 Star realStar; 9 10 public StarHandler(Star realStar) { 11 this.realStar = realStar; 12 } 13 14 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 15 16 System.out.println("处理事务前"); 17 18 method.invoke(realStar,args); 19 20 System.out.println("处理事务后"); 21 return null; 22 23 24 25 } 26 }
client
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.sign(); } }
总结:
原文:https://www.cnblogs.com/xiaoqiqistudy/p/11265588.html