java静态代理,动态代理,cglib代理
代理模式在我们的应用中是很常见的,例如拦截器,spring的事务管理等。之所以能被代理,是因为java允许我们通过反射机制动态构造目标对象,并调用相应的方法。
就好像拿到了目标对象的引用,自然可以在目标对象方法执行前后处理一些自己的任务,例如日志服务拦截器,防止重复提交拦截器等。
1.java的静态代理(纯粹是拿到目标的引用,调用目标方法)
- public interface Hello {
- public void say(String name);
- }
- public class HelloImpl implements Hello{
- @Override
- public void say(String name) {
- System.out.println("Hello!" + name);
- }
- }
- public class HelloProxy implements Hello{
- private Hello hello;
- public HelloProxy() {
- hello = new HelloImpl();
- }
- @Override
- public void say(String name) {
- before();
- hello.say(name);
- after();
- }
- private void before() {
- System.out.println("before......");
- }
- private void after() {
- System.out.println("after......");
- }
- public static void main(String[] args) {
- new HelloProxy().say("麦德漂");
- }
- }
静态的代理,就是讲目标对象做了一层包装,然后调用目标对象的对应方法。
2.java的动态代理(基于接口的代理)
- public class DynamicProxy implements InvocationHandler {
- private Object target;
- public DynamicProxy(Object target) {
- super();
- this.target = target;
- }
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- return method.invoke(target, args);
- }
- public static void main(String[] args) {
- Hello hello = (Hello) Proxy.newProxyInstance(Hello.class.getClassLoader(), new Class[]{Hello.class},new DynamicProxy(new HelloImpl()));
- hello.say("麦德漂");
- }
- }
动态代理相对于静态代理已经方便了很多,不用再去写单独的代理类,只是基于接口才能生效。
3.cglib代理(用过Hibernate的同学一定看到过cglib的身影)
- public class CGLibProxy implements MethodInterceptor{
- public Object getProxy(Object target) {
- return Enhancer.create(target.getClass(), this);
- }
- @Override
- public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
- return methodProxy.invokeSuper(obj, args);
- }
- public static void main(String[] args) {
- Hello hello = (Hello)new CGLibProxy().getProxy(new HelloImpl());
- hello.say("麦德漂");
- }
- }
不再基于接口,强大的高性能生成代码工具。
java静态代理,动态代理,cglib代理的更多相关文章
- spring AOP 代理(静态与动态+使用cglib实现)
一.没有代理模式 缺点: 1.工作量特别大,如果项目中有多个类,多个方法,则要修改多次. 2.违背了设计原则:开闭原则(OCP),对扩展开放,对修改关闭,而为了增加功能把每个方法都修改了,也不便于维护 ...
- java静态和动态代理原理
一.代理概念 为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类 ...
- 分享知识-快乐自己:三种代理(静态、JDK、CGlib 代理)
1):代理模式(静态代理)点我下载三种模式源码 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成 ...
- Java中jdk代理和cglib代理
代理模式 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 在Java中代理模式从实 ...
- Java代理模式之Cglib代理
Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.不鼓励直接使用ASM,因 ...
- 代理模式之Cglib代理
Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. l JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的类,就可 ...
- java 代理模式(静态代理、动态代理、Cglib代理) 转载
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- Java代理模式精讲之静态代理,动态代理,CGLib代理
代理(Proxy)是一种设计模式,通俗的讲就是通过别人达到自己不可告人的目的(玩笑). 如图: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象 这三个代理模式,就 ...
- Spring框架_代理模式(静态代理,动态代理,cglib代理)
共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下: ...
- 轻松理解 Java 静态代理/动态代理
目录 什么是代理模式 定义 代理模式的主要角色 优点 缺点 静态代理 动态代理 JDK原生动态代理 例子 分析 小结 CGLIB动态代理 例子 分析 final类型 其他方案 尾声 理解Java动态代 ...
随机推荐
- [经典] atoi && itoa
atoi原型:int atoi(const char *nptr) atoi,需要考虑的内容: 1. 第一个字符为"-"时为负,系数为-1:为"+"时为正,系数 ...
- 【转】shell 教程——05 第一个Shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码: #!/bin/bash ...
- 【转】shell 教程——03 Shell脚本语言与编译型语言的差异
大体上,可以将程序设计语言可以分为两类:编译型语言和解释型语言. 编译型语言 很多传统的程序设计语言,例如Fortran.Ada.Pascal.C.C++和Java,都是编译型语言.这类语言需要预先将 ...
- c 语言结构体struct的三种定义方式 及 typedef
struct 结构体名{ 成员列表: ..... }结构体变量: 结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量 ...
- 【SQL】MySQL内置函数中的字符串函数和日期时间函数
字符串函数 --拼接字符串组成新的字符串 Select concat(‘A’,’B’); --返回字符串长度 Select length(“CAT”) --返回子字符串在字符串中首次出现的位置,没有返 ...
- idea静态数据加载失败的解决办法
把上图中的resource文件夹(存放xml等配置文件)标记成resource.
- SQL SERVER 中如何将NULL转换为0
select isnull(fieldname,0) from tablename 如果字段fieldname的值是null,则结果是0
- redis学习大全
http://blog.csdn.net/menergy/article/details/17577985 http://blog.sina.com.cn/s/blog_64008ed70102uy ...
- android intent 隐式意图和显示意图(activity跳转)
android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity B ...
- android83 Activity的生命周期,启动模式,返回时传递数据
#Android四大组件 * Activity * BroadCastReceiver * Service * ContentProvider #Activity生命周期 * oncreate:Act ...