jdk代理和cglib代理
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代理的更多相关文章
- 总结两种动态代理jdk代理和cglib代理
动态代理 上篇文章讲了什么是代理模式,为什么用代理模式,从静态代理过渡到动态代理. 这里再简单总结一下 什么是代理模式,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原 ...
- spring的AOP动态代理--JDK代理和CGLIB代理区分以及注意事项
大家都知道AOP使用了代理模式,本文主要介绍两个代理模式怎么设置以及区别,对原文一些内容进行了引用后加入了自己的理解和更深入的阐述: 一.JDK代理和CGLIB代理的底层实现区别* JDK代理只能 ...
- Java中jdk代理和cglib代理
代理模式 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 在Java中代理模式从实 ...
- jdk代理和cglib代理源代码之我见
以前值是读过一遍jdk和cglib的代理,时间长了,都忘记入口在哪里了,值是记得其中的一些重点了,今天写一篇博客,当作是笔记.和以前一样,关键代码,我会用红色标记出来. 首先,先列出我的jdk代理对象 ...
- 设计模式---JDK动态代理和CGLIB代理
Cglig代理设计模式 /*测试类*/ package cglibProxy; import org.junit.Test; public class TestCglib { @Test public ...
- JDK动态代理和 CGLIB 代理
JDK动态代理和 CGLIB 代理 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期期间创建一个接口的实现类来完成对目标对象的代理. 代码示例 接口 public interface ...
- SpringAOP-JDK 动态代理和 CGLIB 代理
在 Spring 中 AOP 代理使用 JDK 动态代理和 CGLIB 代理来实现,默认如果目标对象是接口,则使用 JDK 动态代理,否则使用 CGLIB 来生成代理类. 1.JDK 动态代理 那么接 ...
- 静态代理、动态代理和cglib代理
转:https://www.cnblogs.com/cenyu/p/6289209.html 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处 ...
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation ...
随机推荐
- android之下拉刷新(reflush)
package com.example.reflush; import android.app.ListActivity; import android.os.Bundle; import andro ...
- 认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏
C++中临时对象又称无名对象.临时对象主要出现在如下场景. 1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象. Integer inte= Integer(5); ...
- 设计模式-UML类图的各符号含义(转)
UML类图的各符号含义 类图基本符号可拆分为虚线,箭头,实线,空心右三角,实心右三角,空心菱形和实心菱形.由这些基本的图形进行组合构成了类图的基本符号.这里要注意这几个符号的顺序,代表了类与类之间关系 ...
- 打印心形---print 的基础使用
#!/bin/usr/env python#coding=utf-8'''用学习到的print语句,完成如下图形的打印工作打印心形'''print " *** *** "print ...
- SSAS处理时“找不到属性键”的解决办法 (转载)
在SSAS中,经常会遇到“Attribute key not found(找不到属性键)”的错误,这种错误通常是由于某个维度属性(Dimension Attribute)的数据没能从Sql Serve ...
- [Spring] IOC - Annotation
Spring Annotation使用例子. 与XML配置的例子一样:http://www.cnblogs.com/HD/p/3962541.html Project结构: 配置文件:springCo ...
- 为什么学习Ruby On Rails:
简单总结了一下自己为什么喜欢ruby on rails: 语法简单,写代码很愉快,比较接近伪代码: 喜欢其强大的正则表达式和字符串操作. ruby中面向对象更自由,更动态: ruby给人信任,相信你了 ...
- [经验交流] Apache Mesos Docker集群初探
前言 因工作需要,我对基于Apache Mesos 的 Docker 集群作了一点研究,并搭建了一套环境,以下是资料分享. 1. Apache Mesos概述 Apache Mesos是一款开源群集管 ...
- SQL Server 2012 创建数据库快照
不是所有的MSSQL数据库版本都支持数据库快照,只有Enterprise版本的才支持. 在其他版本上,以Business Intelligence Edition版本为例,创建快照时,会报如下错误 消 ...
- java中向JTextArea中添加滚动条(垂直的和水平的)
这次在研究java的swing类时,在做一个实例时,发现了JTextArea中添加滚动条的问题,经过网上查找资料和自己测试发现有以下用法: 1.首先应该把JTextArea添加到一个JScrollPa ...