1.jdk静态代理(静态代理和动态代理) 本质:在内存中构建出接口的实现类。

  缺陷:只能对实现接口的类实现动态代理,
  使用cglib可以对没有实现接口的类进行动态代理。

2.cglib动态代理     本质:生成被代理对象的子类。

静态代理:proxy_static包下的一个接口和两个实现类

Subject 有两个实现类一个是真实类(RealSubject),一个是代理对象类(ProxySubject),分别重写Subject的eat()方法following:

 public class RealSubject implements Subject {

     public void eat() {
System.out.println("real eat method begin~");
} }

RealSubject

//两种方式,分别是: 将真实对象暴露出来的方法  &&  不将真实对象暴露出来的方法

 public class ProxySubject implements Subject{
private RealSubject realSubject;
public void eat() {
System.out.println("ProxySubject method begin~");
realSubject.eat();
System.out.println("ProxySubject method end~");
}
public RealSubject getRealSubject() {
return realSubject;
}
public void setRealSubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
//不将真实对象暴露出来
/*Subject realSubject = new RealSubject();
public void eat() {
System.out.println("ProxySubject method begin~");
realSubject.eat();
System.out.println("ProxySubject method end~");
}*/
}

ProxySubject

     @Test
public void Proxy_Static(){
//不将真实对象暴露出来的方法
// ProxySubject proxysubject = new ProxySubject();
//
// proxysubject.eat(); //将真实对象暴露出来的方法
RealSubject rs= new RealSubject();
ProxySubject ps = new ProxySubject();
ps.setRealSubject(rs);
ps.eat(); }

测试

jdk动态代理:

proxy_dynamic包下的一个接口和一个实现类

写法依然是最普通的写法,重点在测试类里面

测试如下

 @Test
public void Proxy_jdk_Dynamic(){
final IUserDao dao =new UserDaoImpl();
Object instancedao = Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("增强 begin~");
Object invoke = method.invoke(dao, args);
System.out.println("增强 end~");
return invoke;
}
});
System.out.println(((IUserDao)instancedao).add());
}

cglib动态代理:

测试如下:

     @Test
public void Proxy_cglib_Dynamic(){
final Dog dog = new Dog();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(dog.getClass());
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object proxy, Method method, Object[] arg2,
MethodProxy methodproxy) throws Throwable {
System.out.println("begin~");
Object invoke = method.invoke(dog, arg2);
System.out.println("end~");
return invoke;
}
}); Dog dog2 =(Dog)enhancer.create();
dog2.Say(); }

jdk代理和cglib代理的更多相关文章

  1. 总结两种动态代理jdk代理和cglib代理

    动态代理 上篇文章讲了什么是代理模式,为什么用代理模式,从静态代理过渡到动态代理. 这里再简单总结一下 什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原 ...

  2. spring的AOP动态代理--JDK代理和CGLIB代理区分以及注意事项

    大家都知道AOP使用了代理模式,本文主要介绍两个代理模式怎么设置以及区别,对原文一些内容进行了引用后加入了自己的理解和更深入的阐述:   一.JDK代理和CGLIB代理的底层实现区别* JDK代理只能 ...

  3. Java中jdk代理和cglib代理

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

  4. jdk代理和cglib代理源代码之我见

    以前值是读过一遍jdk和cglib的代理,时间长了,都忘记入口在哪里了,值是记得其中的一些重点了,今天写一篇博客,当作是笔记.和以前一样,关键代码,我会用红色标记出来. 首先,先列出我的jdk代理对象 ...

  5. 设计模式---JDK动态代理和CGLIB代理

    Cglig代理设计模式 /*测试类*/ package cglibProxy; import org.junit.Test; public class TestCglib { @Test public ...

  6. JDK动态代理和 CGLIB 代理

    JDK动态代理和 CGLIB 代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期期间创建一个接口的实现类来完成对目标对象的代理. 代码示例 接口 public interface ...

  7. SpringAOP-JDK 动态代理和 CGLIB 代理

    在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类. 1.JDK 动态代理 那么接 ...

  8. 静态代理、动态代理和cglib代理

    转:https://www.cnblogs.com/cenyu/p/6289209.html 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处 ...

  9. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

    第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation ...

随机推荐

  1. register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动

    内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1 ...

  2. set的应用

    头文件 ;#include <set> 简单应用: begin()     返回set容器的第一个元素 end()   返回set容器的最后一个元素 clear()        删除se ...

  3. wordpress(二)wordpress环境迁移

    迁移wordpress到服务器 本地环境如下 win8.1 appser 服务器环境如下 centos7 lnmp 1.使用phpmyadmin备份本地wordpress站点的数据库 2.备份本地wo ...

  4. JSP知识点汇总

    有几种方法可以实现服务器内部跳转? 使用request对象提供的方法:request.getRequestDispatcher(String URI).forward(ServletRequest r ...

  5. Spring源码学习之:@async 方法上添加该注解实现异步调用的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的.    spring 在扫描be ...

  6. Android学习四:数据库操作

    1前言 android中使用SQLite作为数据库,在进行相关的开发的时候不需要导入包.SQLite起符合SQL标准,也有自己的一些特性,是一个轻量级的数据库. 2代码 简单的数据库类封装 packa ...

  7. 如何设置UNIX/Linux中新创建目录或文件的默认权限

    在unix或者linux中,每创建一个文件或者目录时,这个文件或者目录都具有一个默认的权限,比如目录755,文件644,那么这些默认权限是怎么控制的呢? 答案是"umask"权限掩 ...

  8. 是不是content-type: text/html的数据包一到,浏览器就肯定刷新页面?

    整理自:http://q.cnblogs.com/q/54726/ 是不是content-type: text/html的数据包一到,浏览器就肯定刷新页面? 或者说,浏览器收到的状态正常的conten ...

  9. 【uTenux实验】任务管理

    任务就是一个无限循环.uTenux提供的任务管理功能是很强大的,包括建立和删除一个任务,启动或退出任务,取消一个任务的启动请求,改变任务的优先级和査询任务状态,使任务进人睡眠状态和唤醒状态,取消唤醒请 ...

  10. 原生+jquery 实现好看滚动条。

    //原生 <!doctype html> <html> <head> <meta charset="utf-8"> <titl ...