设计模式之-动态代理
我们需要掌握两个类的使用:
-
public interface InvocationHandler
InvocationHandler
是通过一个代理实例调用处理程序实现的接口。可以通过invoke方法实现对真实角色的代理访问.
通过proxy生成代理类对象,都要指定对应的处理器对象.
-
invoke
Object invoke(Object proxy,方法 method,Object[] args)throws Throwable
在代理实例上处理方法调用,并返回结果。当在与它关联的代理实例上调用方法时,该方法将在调用处理程序上调用此方法。- 参数
proxy
-代理实例,调用的方法- 对接口方法的调用相应的
method
代理实例的方法
实例。声明类的方法
对象将接口的方法声明,这可能是一个超接口代理接口,代理类继承的方法。 args
-包含在方法上通过代理实例调用的实参的值对象的数组,或null
如果接口方法不需要参数。原始类型的实参是包裹在适当的原始包装类的实例,如java.lang.Integer
或java.lang.Boolean
。- 代码:
- star
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(); } }
总结:
- 当我们调代理类的方法 就会进入invoke方法里面执行一次.我们可以在invoke方法中做一些事情的处理.
-