目标:为实现了统一接口的子类的一个共同方法,在这个共同方法之前,或者之后,为这所有的子类加入共同的处理逻辑
实现途径:代理模式;jdk反射机制。
具体步骤:
第一步:写出一个代理类,该类实现了InnovationHandler接口,并实现了invoke(Object proxy,Method method, Object[] args)方法。jdk设计此接口的目的:为需要织入共同处理逻辑的被代理方法,提供了这个接口,方法中的第一个参数为被代理类,通过这个引用,可以执行你想要织入的逻辑代码。method为被代理对象内部的需要被代理的方法,args为需要被代理的方法的参数数组。在这个方法里有一行代码为:method.invoke(beenProxyObect,args);这个是执行了被代理对象的被代理方法。这个方法之前或者之后可以加入逻辑代码。
第二步:客户端应用:首先new一个被代理的对象。然后new出一个代理对象,并且将被代理对象的引用注入到代理对象里面,可以通过构造方法注入。然后通过Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)动态 得到被代理对象的代理对象。然后调用被代理方法。OK,完成。
原理:利用了java的反射机制,在classloader动态加载类的时候。动态得到子类的类型。动态生成需要的代理对象。反射本质即为 类型参数化,也即是说类的类型都可以作为参数了 。并且被代理的类必须实现了统一的接口。