产生代理类的方法当中业务逻辑是固定的,如何动态的实现指定的业务逻辑?
答:可以创建事物处理器,这个事物处理器可以专门对某个对象的方法来进行处理。
案例:
创建一个接口,该接口的名称和JDK的InvocationHandler接口(事物处理器)保持一致,该接口中也定义一个invoke方法,该方法的作用是对某个对象的方法进行处理,所以该方法中需要传入该方法的对象,以及方法,这里为了简便起见,就不传递方法参数了,如图。

实现具体的事物处理:
创建一个类并实现InvocationHandler接口,名称为TimeHandler,实现接口的方法中,在该方法中实现传递进来对象的方法。(注意:这里传递的是代理的对象,我们需要传递被代理的对象,并且调用被代理对象的方法,所以创建一个私有属性Object类型的target,并通过构造方法为该属性赋值)这时调用的才是被代理对象的方法。

在调用该方法的前后可以增加相应的业务逻辑。如图。

这样事物处理就完成了。这里需要在newProxyInstance(Class infce,InvocationHandler h)方法中增加该接口的参数。

InvocationHandler参数传进来之后,需要在动态产生动态代理类源码中
,把InvocationHandler传进来,并把该接口引入进来,如图。

这里"private"+infce.getName()+"m;"+rt+就使用不到了就可以删除掉了。
代理类$Proxy0的构造方法的参数传进来的参数是InvocationHandler,
接下来需要在代理类中调用InvocationHandler接口的invoke方法,该方法中有两个参数,一个是代理对象,一个是代理对象的方法,代理对象就是当前的对象this,方法就是当前的方法("Method md="+infce.getName()+".getClass().getMethod(\""+m.getName()+"\");。
完整代码:

测试:

上一讲到代理,内部的业务逻辑是硬编码的,如何实现真正的动态代理,动态的指定业务逻辑呢? 1.需要创建一个事务处理器,首先创建一个接口也就是InvocationHandler,为了模拟JDK,这里把接口的名字和JDK事务处理器名称一样,同样写一个方法叫做invoke(),用来表示对某个对象的某个方法进行业务处理,所以需要把某个对象以及对象的方法作为invoke()方法的参数传递进来,invoke(Object obj,Method method),方法作为参数使用到了java反射,需要把此包引入。这样InvocationHandler接口就完成了。 2.创建事务处理实现类比如说时间代理TimerProxy,实现了InvocationHandler接口,这样结构就成了 public class TimerProxy implements InvocationHandler{ @Override public void invoke(Object o, Method m) { //业务逻辑 method.invoke(目标对象,参数); //业务逻辑 } 需要将目标对象传入,没有参数可以不写参数,创建代理对象的构造方法,初始化目标对象 3.在Proxy类的newProxyInstance()方法中,除了要把目标Class接口作为参数外,还需要把事务处理器InvocationHandler 传进去,然后更改创建实例对象中硬编码的部分用事务处理器方法替代即可。难点在于字符串的拼接。