|
/* * 只有需要被监控的行为才有资格在这里声明 **/ public interface BaseService { void eat(); void wc(); }
public class Person implements BaseService{ //主要业务,代理模式要求开发人员只关心主要业务 @Override public void eat() { System.out.println("eating......"); } @Override public void wc() { System.out.println("wc......"); } }
public class Invocation implements InvocationHandler { // 具体被监控对象 private BaseService baseService; public Invocation(BaseService baseService) { this.baseService = baseService; } /* * * invoke方法:在被监控行为将要执行时,会被JVM拦截 被监控行为和行为实现方会被作为参数输送invoke * ****通知JVM,这个被拦截方法是如何与当前次要业务方法绑定实现 invoke方法三个参数 * * int v= 小明.eat();//JVM拦截 method:eat方法封装为Mehtod类型对象 * params:eat方法运行时接受所有的实参封装到Object[] proxy:将负责监控小明的代理对象作为invoke方法第一个参数 * */ // 通知JVM,当前被拦截的主要业务与次要业务应该如何绑定执行 @Override public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { // 0.局部变量,接受主要业务方法执行完毕后返回值 Object value; // 1.确认当前被拦截行为 String methodName = method.getName(); // 2.根据被拦截行为,决定主要业务和次要业务如何绑定执行 if ("eat".equals(methodName)) { // 饭前先洗手 wash(); value = method.invoke(this.baseService, params); } else { // 便后要洗手 value = method.invoke(this.baseService, params); wash(); } // 3.返回被拦截的方法 return value; } // 次要业务具体实现 private void wash() { System.out.println("---洗手---"); } }
/* * * JDK动态代理模式下,代理对象的数据类型 * 应该由监控行为来描述 * 参数: Class文件,监控类 */ public class ProxyFactory { public static BaseService builder(Class<?> classFile) throws Exception { // 1.创建一个被监控实例对象 BaseService baseService = (BaseService) classFile.newInstance(); // 2.创建一个通知对象 InvocationHandler adviser = new Invocation(baseService); /* * newProxyInstance的三个参数: * loader:被监控对象隶属的类文件在内存中真实地址 * interfaces:被监控对象隶属的类文件实现接口 * h:监控对象发现小明要执行被监控行为,应该有哪一个通知对象进行辅助 */ // 3.向JVM申请负责监控baseService对象指定行为的监控对象(代理对象) BaseService $proxy = (BaseService) Proxy.newProxyInstance(baseService.getClass().getClassLoader(), baseService.getClass().getInterfaces(), adviser); return $proxy; } }
5.测试代码
public class TestMain { public static void main(String[] args) throws Exception { BaseService person = ProxyFactory.builder(Person.class); person.eat(); person.wc(); System.out.println("-----------------------------"); BaseService animal = ProxyFactory.builder(Animal.class); animal.eat(); animal.wc(); } }
输出结果:
原文:https://www.cnblogs.com/currystar/p/10877211.html