import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import java.lang.reflect.Method;import java.util.Arrays;import java.lang.IllegalAccessException;public class DynamicProxyExample {// 原接口interface Hello {void sayHi(String[] args);}// 接口实现类static class HelloImpl implements Hello {public void sayHi(String[] args) {System.out.println("HelloImpl:" + Arrays.toString(args));}}// 动态代理, 该 class对 Hello一无所知static class LogInvocationHandler implements InvocationHandler {private Object target;LogInvocationHandler() {}// 绑定一个 target, 返回一个代理对象Object bind(Object target) {this.target = target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), // 1. 类加载器target.getClass().getInterfaces(), // 2. 代理需要实现的接口, 可以多个this // 3. 方法实际处理者);}// 第一个参数 proxy是什么// https://stackoverflow.com/questions/22930195/understanding-proxy-arguments-of-the-invoke-method-of-java-lang-reflect-invoca// proxy 可以看成 上下文一样的东西, return proxy 后可以 链式调用@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable{System.out.println("logger before");Object result = method.invoke(target, args);System.out.println("logger after");return result;}}// 调用public static void main(String[] args) throws IllegalAccessException {System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true"); // 看到生成的代码,LogInvocationHandler proxy = new LogInvocationHandler();Hello hello = (Hello)proxy.bind(new HelloImpl());hello.sayHi(new String[] {"foo", "bar"});}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。