http://www.cnblogs.com/MOBIN/p/5597215.html 请先查看这边博文
此文主要是在上篇博文的基础之上,宏观的理一下思路,因为之前本人看了上篇之后云里雾里(是本人技术不到位)。然后研究了一会儿jdk1.8的源码之后写了此篇,不是很准确,源码上篇博文之中已经很多了,我就不加了。
1 获取代理对象,需要传入类加载器,需要被实现的接口, InvocationHandler对象(该对象中,包含了我们自己编写的接口实现类实例,也就是未被代理的业务逻辑)
调用的是 Proxy类中的newProxyInstance(classloader,interfaces,invocationHandler)方法
2 newProxyInstance 方法调用 getProxyClass0(loader,interfaces);来获取代理类class对象,然后获取getConstructor(constructorParams)来获取构造方法,然后传入InvocationHandler对象来实例化代理对象并返回
3 getProxyClass0方法中主要实现的逻辑是,获取接口中的方法method(反射),将接口的包名全路径,方法名记录下来,在代理类中实现(通过字节码的方式,可以研究源码),通过static静态代码块的方式,将method通过反射的方式注入到代理类中m1,m2,m3等,同时还实现了equals,hashmap等方法,最后通过传入的InvocationHandler对象,来调用this.h.invoke(this, method, null); 方法 this就是代理类对象,method是通过静态注入获取到的method对象,是接口所定义的。
在我们实现的InvocationHandler对象中实现了如下方法
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(“—– before —–“); Object result = method.invoke(target, args); System.out.println(“—– after —–“); return result; }
其中:proxy是代理类实例,method是接口中的方法对象,也是在代理类中实现的当前方法,是代理类实现接口方法的时候作为参数传递过来的,args是参数,方法没有入参则为null
method.invoke(target,args)是java反射中的方法.target是接口实现类的实例,method是接口定义的方法。