privatestatic Class<?>getProxyClass0(ClassLoader loader, Class<?>... interfaces){//异常处理先不关注if(interfaces.length >65535){thrownewIllegalArgumentException("interface limit exceeded");}// If the proxy class defined by the given loader implementing// the given interfaces exists, this will simply return the cached copy;// otherwise, it will create the proxy class via the ProxyClassFactory//1.从英文注释大致知道,有些情况会从缓存获取,有些情况会通过ProxyClassFactory创建proxy,继续跟进该方法(proxyClassCache是WeakCache类)return proxyClassCache.get(loader, interfaces);}
invoke方法的三个参数,第二个是方法名称,第三个是参数列表,第一个proxy我们好像并没有用到,作用是啥? 查了一下有下面2个的作用,一个是在方法内可以反射获取proxy的信息,另一个是可以在invoke方法中返回proxy,返回的这个proxy 实际上就是我们的代理对象,这里不能返回this,因为这里的this只是一个handler对象而已,什么情况下返回proxy对象?返回有没有用呢? 返回之后,我们可以用这个proxy再继续调用方法,前面我们不是看到proxy实现了接口的方法嘛?加入接口有多个方法,我调用了方法1,还要继续调用方法2 那么我就可以在方法1处理完之后返回proxy,在由proxy调用方法2,类似于链式编程,可以查看下面的链接和代码示例 Understanding “proxy” arguments of the invoke method of java.lang.reflect.InvocationHandler
接口:privateinterfaceAccount{public Account deposit (double value);publicdouble getBalance ();}
自定义handler:privateclassExampleInvocationHandlerimplementsInvocationHandler{privatedouble balance;@Overridepublic Object invoke (Object proxy, Method method, Object[] args)throws Throwable {// simplified method checks, would need to check the parameter count and types tooif("deposit".equals(method.getName())){
Double value =(Double) args[0];
System.out.println("deposit: "+ value);
balance += value;return proxy;// here we use the proxy to return 'this'}if("getBalance".equals(method.getName())){return balance;}return null;}}
使用:
Account account =(Account) Proxy.newProxyInstance(getClass().getClassLoader(),newClass[]{Account.class, Serializable.class},newExampleInvocationHandler());//链式调用,因为每一步调用都把proxy对象给返回了
account.deposit(5000).deposit(4000).deposit(-2500);