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执行后,我想添加的一些实现
很简单吧&_^
- jdk动态代理的实现
- jdk的动态代理实现
- JDK动态代理的实现
- JDK动态动态代理和cglib动态代理的实现
- JDK动态代理实现
- jdk动态代理实现
- 实现jdk动态代理
- jdk动态代理实现
- jdk实现动态代理
- JDK实现动态代理
- JDK动态代理实现
- AOP的底层实现--JDK动态代理,CGLIB动态代理
- JDK动态代理实现的思考
- 简单的 JDK实现动态代理
- jdk、cglib实现动态代理的异同
- 深入理解 jdk 动态代理的实现
- 模拟JDK动态代理类的实现
- 细说JDK动态代理的实现原理
- java多线程的二种实现
- LazyManage中文注释学习版
- perl特殊变量
- li 样式 不显示 overflow:hidden 导致Li前面样式不见的解决办法
- PHP中的生成XML文件的4种方法
- jdk动态代理的实现
- 采用离线连接方式安装Eclipse插件M2Eclipse
- C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文
- 使用PhoneGap开发Android程序小记
- hdu1164-Eddy's research I
- API 操作注册表
- Android-ndk, JNI, sockt32.cpp:INVALID_SOCKET解决
- Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
- http-equiv是什么意思