//1.主题订阅接口 package com.bjpowernode.invocationHandler; public interface Subject { public void sailBook(); } //2.真实的实现类 package com.bjpowernode.invocationHandler; public class RealSubject implements Subject { @Override public void sailBook() { System.out.println(“卖书”); } } //3.代理类的调用处理程序 package com.bjpowernode.invocationHandler;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;
;
//Myhandler是代理实例的调用处理程序类,那么还要为代理类创建一些方法,比如打折,送优惠券 public class MyHandler implements InvocationHandler { //主题卖书的实现类 private RealSubject realSubject;
//set方法是生成realSubject对象的/* public void setRealSubject(RealSubject realSubject) { this.realSubject = realSubject; }*/
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; discharge(); //这个就是卖书方法了(这里是用的反射,相当于 // 这样 RealSubject realSubject=new RealSubject() // realSubject.sailBook();方法没参数,所以args不写) //以前版本的开发工具有异常要处理,现在不需要了。 if(realSubject==null){ realSubject=new RealSubject(); } result = method.invoke(realSubject, args); cashCoupon(); return result; } public void discharge() { System.out.println("打7折"); } public void cashCoupon() { System.out.println("送10元代金券"); }} //4.测试入口
@SpringBootApplication public class Application {
public static void main(String[] args) { // SpringApplication.run(Application.class, args); RealSubject realSubject=new RealSubject(); //JDK帮我们自动生成代理类,所以动态代理没有代理类了 //myHandler不是代理类,Myhandler是代理类的调用处理程序类 MyHandler myHandler=new MyHandler(); /* myHandler.setRealSubject(realSubject);*/ //返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。proxySubject才是真正的代理类 Subject proxySubject = (Subject) Proxy.newProxyInstance(RealSubject.class.getClassLoader(), realSubject.getClass().getInterfaces(), myHandler); proxySubject.sailBook(); //倒错包很烦****** }} //测试结果 打7折 卖书 送10元代金券
Process finished with exit code 0