下面我模仿了一下JDK动态代理的实现,源码没看,这里不不过是根据他的功能按照自己的方式实现.
使用技术
关键是回调函数的使用。
文档:
我们既然使用动态代理无非想在现有的方法中添加一些操作。所以在创建的子类方法中调用回调函数。
创建子类涉及动态字节码技术,我就写死一个subclass代替
创建Proxy类负责创建子类对象
一:回调函数模块:
1:创建接口
package callback;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public interface CallBackInterface {public Object callback(Method method,Object obj,Object[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException;}
package callback;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class ClientTs implements CallBackInterface{/** 回调函数**/public Object callback(Method method, Object obj, Object[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {System.out.println("事务处理执行");Object result = method.invoke(obj, args);System.out.println("事务处理结束");return result;}}
3:服务实现:
package callback;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class CallBackTs {private CallBackInterface cbi;public CallBackTs(CallBackInterface cbi){this.cbi = cbi;}/** * 调用client中的callback()函数* 具体的子类,其实现的方式不同*/public Object interceptor(Method method, Object obj, Object[] args){Object result = null;try {result = cbi.callback(method, obj, args);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return result;}
}
二:代理模块
1:业务接口: 其实不使用接口也是 可行的
package callback;public interface FatherInter {public void add(String name,String love);public void answer(String text);
}
2:接口实现类:
package callback;public class Father implements FatherInter{public void add(String name,String love){System.out.println("My name is "+name);System.out.println("and My favorites are "+love);}public void answer(String text){System.out.println("did you feel surprise about "+text);}
}
3:创建father的子类:
package callback;import java.lang.reflect.Method;/*** SubClassTs 是Father模拟的动态子类 FatherInter是他们的接口* @author 追本溯源**/
public class SubClassTs extends Father implements FatherInter {private Object target;private CallBackTs cbt = null;public SubClassTs(CallBackTs cbt,Object target){this.cbt = cbt;this.target = target;}public void add(String name,String love){try {//本以为extends Father//this.add指的是被覆盖的当前add,递归,死循环//this.add("one", "two");Method method = target.getClass().getMethod("add", new Class[]{String.class,String.class});Object[] args = {name,love};cbt.interceptor(method, target, args);} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}public void answer(String text){try {Method method = target.getClass().getMethod("answer", new Class[]{String.class});Object[] args = {text};cbt.interceptor(method, target, args);} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}
}
4:创建Proxy类实现子类的创建:
package callback;public class Proxy {/** 创建子类对象** @throws IllegalAccessException * @throws InstantiationException */public static Object newProxy(CallBackInterface cif,Class clazz) throws InstantiationException, IllegalAccessException{CallBackTs cbt = new CallBackTs(cif);return new SubClassTs(cbt,clazz.newInstance());}
}
5:创建对象并测试:
package callback;public class ProxyTs {public static Object getProxyTs(Class clazz){//这里简单的创建子类SubClass对象Object obj = null;try {obj = Proxy.newProxy(new ClientTs(),clazz);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return obj;}public static void main(String[] args) throws InstantiationException, IllegalAccessException {FatherInter father = (FatherInter) ProxyTs.getProxyTs(Father.class);father.add("追本溯源", "写代码");father.answer("前途渺茫");}
}
结果:
事务处理执行
My name is 追本溯源
and My favorites are 写代码
事务处理结束
事务处理执行
did you feel surprise about 前途渺茫
事务处理结束
有很多要该进的地方,至少和cglib类中Enhancer差距还是非常大的。