Java 动态代理实例
来源:互联网 发布:运动会班服创意知乎 编辑:程序博客网 时间:2024/05/21 10:17
程序的代理模式:
当一个对象不能直接操作另一个对象时采用代理(Proxy)模式。在代理模式中可以添加一些其他业务逻辑如:日志操作、权限控制等。
代理的实现方式有两种:
1.静态代理:通过程序硬编码,为目标类做一层封装,但最终操作的还是目标类;
2.动态代理:在运行期生成目标对象的代理对象。
本为主要讲述动态代理的两种实现方式:JDK动态代理、CGLIB动态代理。
实例:
A.定义目标类与其扩展的接口
//定义一个学习接口package phda.proxy;public interface Study { public void study(String name);//提供一个学习方法}//其扩展类package phda.proxy;public class Robot implements Study { public void study(String name) { System.out.println("机器人 :"+name+" learn"); }}
B.JDK动态代理实现:
package phda.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * jdk 动态代理测试 * @author Administrator * */public class JDKProxy { public static Object getProxyObject(final Object c){ return Proxy.newProxyInstance(c.getClass().getClassLoader(),//目标类的classLoader c.getClass().getInterfaces(), //目标类有实现的接口 new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("可以定义一些其他业务操纵:日志操作"); System.out.println("JDK代理实现:"+method.getName()); return method.invoke(c, args); } }); } public static void main(String[] args) { Robot r = new Robot();//这是直接获得对象 //r.study("jiqiren"); Study r2 =(Study)JDKProxy.getProxyObject(r);//获得一个代理对象 r2.study("代理对象"); }}
说明:
1.使用jdk 动态代理,目标类必须要有扩展的接口;
2.代理生成的对象为目标类扩展接口的实现类之一;
打印结果:
可以定义一些其他业务操纵:日志操作JDK代理实现:study机器人 :代理对象 learn
C.CGLIB代理实现:
package phda.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/** * cglib 代理 * @author Administrator * */public class CGLIBObject { public static Object getPoxyObject(Object c) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(c.getClass()); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("CGLIB动态代理:"+arg1.getName()); arg3.invokeSuper(arg0, arg2); return null; } }); return enhancer.create(); }public static void main(String[] args) { Robot r = new Robot(); Study r2 =(Robot) CGLIBObject.getPoxyObject(r); r2.study("nini");} }
说明:
1.这种代理没有接口的限制;
2.代理生成的对象可以是目标对象类型,也可以是接口的扩展类型;
资源下载
动态代理实例下载
阅读全文
0 0
- java动态代理实例
- java动态代理实例
- java动态代理实例
- JAVA动态代理实例
- Java动态代理实例
- Java 动态代理实例
- Java 动态代理实例
- java动态代理简单实例
- java cglib动态代理 实例
- java动态代理简单实例。
- java动态代理简单实例
- java动态代理【简单实例】
- Java静态代理、动态代理实例
- Java静态代理、动态代理实例
- Java动态代理模式(Proxy)实例
- java动态代理对象实例的创建
- Java反射机制和动态代理实例
- Java代理(jdk静态代理、动态代理和cglib动态代理)实例及总结
- SOA面向服务架构
- 安卓之动画制作
- 理解Java虚拟机体系结构
- 使用NPOI读Excel文件
- python小工具--将csv文件转化为图像
- Java 动态代理实例
- Oracle SQL语句之常见优化方法总结
- 安卓之自定义UI(画布Canvas)
- 2. Servlet
- 第3章 字符串、向量和数组
- 372在O(1)时间复杂度删除链表节点
- 使用NPOI读取Excel文件
- 框架
- selenium+java自动化测试环境搭建介绍