上一编bolg我们已经了解了jdk实现的动态代理,接下来我们再来了解一下cglib的动态代理。
首先我们先看一下cglib动态代理怎么写。
目标类:BookService
package com.cglib.proxy; public class BookService { public void add(){ System.out.println("添加图书...."); } }
Cglib代理实现类:BookCglibProxy
package com.cglib.proxy; 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 BookCglibProxy implements MethodInterceptor { /** 被代理对象 */ private Object target; public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass());//目标类作为父类 // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } /** * 回调方法 */ public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事务开始...."); Object result = proxy.invokeSuper(obj, args); System.out.println("事务结束...."); return result; } }
Cglib测试类:TestCglibProxy
package com.cglib.proxy; public class TestCglibProxy { public static void main(String[] args) { BookService target = new BookService(); BookCglibProxy bookCglib = new BookCglibProxy(); BookService proxy = (BookService) bookCglib.getInstance(target); proxy.add(); } }
测试结果
事务开始.... 添加图书.... 事务结束....
接下来首先我们了解一下cglib实现动态代理的原理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
跟着我们简单了解一下CGLIB
一、什么是CGLIB
CGLIB是一个强大的高性能的代码生成包。
1>它广泛的被许多AOP的框架使用,例如:Spring AOP和dynaop,为他们提供方法的interception(拦截);
2>hibernate使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的);
3>EasyMock和jMock是通过使用模仿(moke)对象来测试java代码的包。
它们都通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。
二、底层
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM(Java字节码操控框架),来转换字节码并生成新的类。除了CGLIB包,脚本语言例如 Groovy和BeanShell,也是使用ASM来生成java的字节码。当不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。所以cglib包要依赖于asm包,需要一起导入。下图为cglib与一些框架和语言的关系(CGLIB Library and ASM Bytecode Framework)
总结
典型的JDK动态代理创建过程可分为以下四个步骤:
1、通过实现InvocationHandler接口创建自己的调用处理器 IvocationHandler handler = new InvocationHandlerImpl(...);
2、通过为Proxy类指定ClassLoader对象和一组interface创建动态代理类
Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
3、通过反射机制获取动态代理类的构造函数,其参数类型是调用处理器接口类型
Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4、通过构造函数创建代理类实例,此时需将调用处理器对象作为参数被传入
Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
为了简化对象创建过程,Proxy类中的newInstance方法封装了2~4,只需两步即可完成代理对象的创建。
生成的ProxySubject继承Proxy类实现Subject接口,实现的Subject的方法实际调用处理器的invoke方法,而invoke方法利用反射调用的是被代理对象的的方法(Object result=method.invoke(proxied,args))
典型的CGLIB动态代理创建过程可分为以下两个步骤:
1、通过实现MethodInterceptor接口自定义方法创建代理对象;
(1).方法内首先利用Enhancer对象设置需要代理的类;
(2).然后设置回调方法enchancer.setCallback(this);
(3).最后通过字节码技术动态创建代理对象enhancer.create()。
2、实现public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)回调方法拦截所有目标类方法的调用。
(1).目标方法调用前的动态增强处理;
(2).通过proxy代理实例调用proxy.invokeSuper(obj, args)调用父类方法执行目标方法;
(3).目标方法调用后的动态增强处理。
相关推荐
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...
Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...
Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...
二是JDK的动态代理API,如java.lang.reflect.Proxy类。动态代理更加灵活,不需要为每个目标类单独编写代理类。 3. **远程代理:**远程代理是代理模式的一个特殊应用,它使得客户端可以像操作本地对象一样操作远程...
### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...
在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...
二、静态代理 静态代理是在编译时就确定的,代理类的代码是显式编写的。在给定的例子中,`HelloServiceProxy` 是一个静态代理类,它持有一个 `HelloService` 的引用,即 `HelloServiceImpl` 对象。当客户端调用 `...
#### 二、Java动态代理机制 Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了一个静态方法`newProxyInstance()`用于创建动态代理对象,而`...
java动态代理 public class HireProxy implements InvocationHandler { //被代理的真实角色 private Object obj; public HireProxy(Object obj) { super(); this.obj = obj; } //第二个参数method,被...
Java代理在编程中是一种强大的设计模式,它允许我们在不修改原始类代码的情况下,为对象提供额外的功能或控制。在这个“java代理实例”中,我们将会深入探讨Java动态代理(Dynamic Proxy)以及静态代理(Static ...
二、 静态代理 静态代理是代理模式的一种实现方式,即通过手动编写代理类来实现对目标对象的代理。例如,以下代码展示了如何使用静态代理对 UserServiceImpl 进行功能增强: ```java public class UserServiceProxy...
### Java代理模式和动态代理详解 #### 一、概述 在软件工程中,代理模式是一种常用的软件设计模式,主要用于在不直接暴露目标对象的情况下提供一个替代接口。这种模式可以简化客户端与目标对象之间的交互,同时还...
### Java代理技术详解:JDK代理、CGLIB与AspectJ #### 一、代理模式简介 代理模式是一种常见的设计模式,在《Design Patterns in Java》一书中对其有明确的定义:“代理模式为一个对象提供一个代理,以控制对该...
#### 二、Java动态代理的基本原理 Java动态代理的核心是`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。下面详细介绍这两个核心组成部分: 1. **`Proxy`类**:提供了一系列静态方法...
#### 二、Java动态代理原理 Java动态代理的核心类主要有两个:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。 1. **Proxy**:这是一个工具类,用于创建一个实现了一组给定接口的动态代理...