代理:即为访问对象添加一层控制层,使其间接化,控制层可以为对象访问添加操作属性。

一、cglib:Code Generation library

  • 基于ASM(java字节码操作码)的高性能代码生成包

  • 被许多AOP框架使用

  • 区别于JDK动态代理,cglib不需要实现接口。

实例:

import java.lang.reflect.Method;  

 import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class MyMethodInterceptor implements MethodInterceptor { public String myFun(String arg){
return "hello," + arg ;
} public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
String methodName = method.getName(); System. out .println( "[intercept] fun invoked before" );
String result = (String)args[0] + "..." ;
System. out .println( result );
System. out .println( "[intercept] fun invoked after" );
return result;
} public Object createProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyMethodInterceptor. class );
enhancer.setCallback( this );
return enhancer.create();
} public static void main(String[] args) {
MyMethodInterceptor ss = new MyMethodInterceptor();
MyMethodInterceptor proxy = (MyMethodInterceptor)ss.createProxy(); c1.myFun( "cglib test" ); } }

通用工具类:

package org.windwant.spring.core.proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /**
* Created by windwant on 2016/6/4.
*/
public class MyCGLIBProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
} public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib before action");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("cglib after action");
return result;
}
}
MyCGLIBProxy p = new MyCGLIBProxy();
Performer pp = (Performer) p.getProxy(XXXX.class);
pp.XXXX();

二、JDK动态代理

package org.windwant.spring.core.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* Created by windwant on 2016/6/4.
*/
public class MyJDKProxy implements InvocationHandler{
private Object targetObject;
public Object getInstance(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy: before action");
Object resutl = method.invoke(targetObject, args);
System.out.println("proxy: after action");
return resutl;
}
}
MyJDKProxy mp = new MyJDKProxy();
XXX ap = (XXX) mp.getInstance(new APerformer());
ap.XX();

三、Java javassist 动态代理

package org.windwant.spring.core.proxy;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod; /**
* Created by windwant on 2016/9/18.
*/
public class MyJavassistProxy { public Object getProxySelf(String clazz, String pClazz, String methodName, String methodBefore, String methodAfter){
ClassPool cp = ClassPool.getDefault();
CtClass ct;
try {
ct = cp.get(clazz);
if(pClazz != null){
ct.setSuperclass(cp.get(pClazz));
}
ct.writeFile();
ct.defrost();
CtMethod m = ct.getDeclaredMethod(methodName);
if(methodBefore != null) {
m.insertBefore(methodBefore);
}
if(methodAfter != null) {
m.insertAfter(methodAfter);
}
Class c = ct.toClass();
return c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
} }
public void testJavassist(){
String clazz = "org.windwant.spring.core.proxy.Hello";
String methodBefore = "{ System.out.println(\"method before...:\"); }";
String methodAfter = "{ System.out.println(\"method after...:\"); }";
String pClazz = "org.windwant.spring.core.proxy.HelloP"; Hello hello = (Hello) new MyJavassistProxy().getProxySelf(clazz, null, "say",
methodBefore, methodAfter);
hello.say();
}

cglib动态代理的更多相关文章

  1. CGLib动态代理原理及实现

    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...

  2. Spring中的cglib动态代理

    Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...

  3. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  4. JDK动态代理与CGLib动态代理

    1.JDK动态代理 JDK1.3以后java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,动态代理是实现AOP的绝好底层技术. JDK的动态代理主要涉及到java.lang.reflect ...

  5. Java代理(jdk静态代理、动态代理和cglib动态代理)

    一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 /** * 业务接 ...

  6. [z]Java代理(jdk静态代理、动态代理和cglib动态代理)

    一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 ...

  7. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  8. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  9. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

  10. Java基础-CGLIB动态代理

    JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继 ...

随机推荐

  1. 符合我公司GIS开源解决方案的探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一周,我对GIS开源解决方案中涉及到的开源软件以及相关技术 ...

  2. 在Mac上开发使用yeoman构建Asp.net core项目并且实现分层引用

    1.Yeoman? yeoman是一个自动化脚手架工具.它提供很多generator,generator相当于VisualStudio的模板,用来初始化项目.更多的就不多说了,写一遍都写不完,自己看吧 ...

  3. 在C#中,Json的序列化和反序列化的几种方式总结

    在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...

  4. Keil环境中建立带FreeRTOS的STM32L项目

    本文是网上转载,版权所有. Keil环境中建立带FreeRTOS的STM32L项目 1.先把source文件夹复制至project目录,然后在keil中添加RTOS文件,如图: 其中heap_2.c按 ...

  5. 什么是SARG ?

    看书看到好几次这几个字母,每次都查,每次查完下次看到还忘记,还是得查. 简单的理解就是:sql查询语句查询过程中用到索引查找的是SARG写法 sql查询语句查询过程中未用到索引就是非SARG写法

  6. 装饰模式 - Decorator 和 外观模式 - Facade

    装饰模式 Decorator,不改变接口但动态给对象加入责任,所需功能按顺序串联起来控制,比生成子类灵活. 外观模式 Facade,让接口更简单.为子系统中的一组接口提供一个一致的界面. 参考:

  7. DDD心得

    使用DDD分层架构有哪些好处 帮你更集中的管理业务逻辑. 帮你降低各层间,以及各业务模块间的依赖关系. 帮你更方便的进行单元测试. 我的DDD分层架构使用经验 使用充血模型,将业务逻辑尽量放到领域实体 ...

  8. C++_系列自学课程_第_6_课_bitset集_《C++ Primer 第四版》

    在C语言中要对一个整数的某一个位进行操作需要用到很多的技巧.这种情况在C++里面通过标准库提供的一个抽象数据类型 bitset得到了改善. 一.标准库bitset类型 1.bitset的作用 bits ...

  9. Xdebug文档(二)变量显示特性

    Xdebug能替代PHP的var_dump()函数来显示变量值.xdebug的版本包含对不同数据类型作数组元素/对象属性.最大深度和字符串长度以不同颜色标识.这里也有一些功能能很好地处理变量显示. 相 ...

  10. Java基础学习--抽象类与抽象函数

    abstract class 抽象类不能制造对象,但是可以定义变量,赋给这个变量的一定是他非抽象子类的对象: 抽象类中的抽象函数没有函数体,例如:public abstract void move() ...