代理模式在我们的应用中是很常见的,例如拦截器,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代理的更多相关文章

  1. spring AOP 代理(静态与动态+使用cglib实现)

    一.没有代理模式 缺点: 1.工作量特别大,如果项目中有多个类,多个方法,则要修改多次. 2.违背了设计原则:开闭原则(OCP),对扩展开放,对修改关闭,而为了增加功能把每个方法都修改了,也不便于维护 ...

  2. java静态和动态代理原理

    一.代理概念 为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类 ...

  3. 分享知识-快乐自己:三种代理(静态、JDK、CGlib 代理)

    1):代理模式(静态代理)点我下载三种模式源码 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成 ...

  4. Java中jdk代理和cglib代理

    代理模式 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 在Java中代理模式从实 ...

  5. Java代理模式之Cglib代理

    Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.不鼓励直接使用ASM,因 ...

  6. 代理模式之Cglib代理

    Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. l  JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的类,就可 ...

  7. java 代理模式(静态代理、动态代理、Cglib代理) 转载

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  8. Java代理模式精讲之静态代理,动态代理,CGLib代理

    代理(Proxy)是一种设计模式,通俗的讲就是通过别人达到自己不可告人的目的(玩笑). 如图: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象 这三个代理模式,就 ...

  9. Spring框架_代理模式(静态代理,动态代理,cglib代理)

    共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                 ...

  10. 轻松理解 Java 静态代理/动态代理

    目录 什么是代理模式 定义 代理模式的主要角色 优点 缺点 静态代理 动态代理 JDK原生动态代理 例子 分析 小结 CGLIB动态代理 例子 分析 final类型 其他方案 尾声 理解Java动态代 ...

随机推荐

  1. bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)

    4016: [FJOI2014]最短路径树问题 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 426  Solved: 147[Submit][Stat ...

  2. Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 833  Solved: 397[Submit][Status][D ...

  3. android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    一.摄像头工作原理 上一篇我们讲了摄像头模组的组成,工作原理,做为一种了解.下面我们析摄像头从寄存器角度是怎么工作的.如何阅读摄像头规格书(针对驱动调节时用到关键参数,以GT2005为例). 规格书, ...

  4. HW4.15

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  5. ios UI 之间的切换方法,using prepareForSegue and not

    1, use prepareForSegue: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { RWTDe ...

  6. dd usb 启动盘制作 成功版本

    在linux系统中,使用dd命令制作启动盘成功.方法是在终端中输入命令:     dd if=/root/opensuse.iso of=/dev/sdb bs=4M     说明:      1.o ...

  7. linux查看服务器型号

    dmidecode | grep "Product";  

  8. cygwin下安装hadoop0.20

    安装时选择软件包: editor-两个VIM.base-SED.Net-OPENSSH.OPENSSL.libs-libintl3和libintl8 环境变量: path=%JAVA_HOME%\bi ...

  9. 【SQL】MySQL内置函数中的字符串函数和日期时间函数

    字符串函数 --拼接字符串组成新的字符串 Select concat(‘A’,’B’); --返回字符串长度 Select length(“CAT”) --返回子字符串在字符串中首次出现的位置,没有返 ...

  10. JSP_DAO方式实现数据库查询(MyEclipse10,Tomcat7.0,JDK1.7,)——Java Web练习(四)

    1.项目结构: 2.创建数据库.表.插入记录 create database TestDao; use TestDao; create table student( stuid int, userna ...