jdk动态代理的实现

来源:互联网 发布:servlet获取文本框数据 编辑:程序博客网 时间:2024/05/16 19:57

代理分为静态代理和动态代理,静态代理完全是一些硬编码操作,如果有介个接口,和他们的实现类,就要写多个代理器。很麻烦

动态代理步骤:

将接口A的实现类AImpl的类对象,实现的接口(class.getInterfaces()) 传给具体的封装好的类。

然后生成一个Aimpl的子类,重写父类中的方法,在这些方法中加入invoke(),在这invoke中调用的其实还是父类中的方法和另外一些添加的功能操作

创建出这个子类对象,调用子类的方法。


代码示例:

功能接口:

package dynamic;/** * 功能方法 * @author 追本溯源 * */public interface InterfaceTs {public void introduce(String speak);public void profession(String work);public void residence(String place);}
接口实现类:

package dynamic;public class InterfaceImpl implements InterfaceTs {public void introduce(String speak) {System.out.println("大家好,我是追本溯源,我是新手请多照顾");}public void profession(String work) {System.out.println("我从事J2EE");}public void residence(String place) {System.out.println("先居住地在杭州");}}


动态代理实现:

package dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 实现动态代理的接口 * @author 追本溯源 * */public class JdbDynamicTs implements InvocationHandler{Object target = null;/** *  * @param clazz  target.class * @return */public Object bind(Class clazz){try {//反射对象,方便用户传递参数target = clazz.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}//this指的invoke 这是一个回调函数 将this传递到Proxy类,在newProxyInstance中调用这个接口的invoke方法//这里我要说下我的看法,下面的invoke(Object proxy..)这个proxy让我很无语,为什么不是target这个对象呢?//这里倒是没什么不方便,但是如果bind函数和invoke函数分开呢?还要还要在invoke所在的类中为target传参//还不如直接将invoke(Object target)这么改写,只要在Proxy.newProxyInstance中为其注入就行了//在Proxy类的newProxyInstance中传入了target的类加载器,可以动态生成子类,return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);}/** *  动态代理有什么用 *  想在一个实现好的类的方法中在添加一些功能,但是又不能在这些类上直接改写 *  那么就来用动态代理吧 */public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {//我想另外添加的一些操作,比如说是日志的记录System.out.println(method.getName()+"执行前,我想添加的一些实现");//这里的target要注意了,不要写成proxyObject result = method.invoke(target, args);System.out.println(method.getName()+"执行后,我想添加的一些实现");return result;}}

测试函数:

package dynamic;public class MainTs {public static void main(String[] args) {JdbDynamicTs jdt = new JdbDynamicTs();//InterfaceTs是一个接口 InterfaceImpl是实现类InterfaceTs it = (InterfaceTs)jdt.bind(InterfaceImpl.class);//是不是很奇怪,下面方法执行后才会去回调invoke()//这里的it是动态产生的子类,里面的方法如introduce{invoke()}。放进里面了it.introduce("");it.profession("");it.residence("");}}

结果:

java.lang.reflect.InvocationHandlerintroduce执行前,我想添加的一些实现大家好,我是追本溯源,我是新手请多照顾introduce执行后,我想添加的一些实现profession执行前,我想添加的一些实现我从事J2EEprofession执行后,我想添加的一些实现residence执行前,我想添加的一些实现先居住地在杭州residence执行后,我想添加的一些实现

很简单吧&_^

原创粉丝点击