`

java 动态代理(四)——动态代理(cglib)

 
阅读更多

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

 

cglib动态代理示例:

1、被代理类:CgLibClass

 

package test.proxy;

/**
 * cglib 被代理类
 * 
 * @author guweiqiang
 */
public class CgLibClass {

	public void testCglib(){
		System.out.println("testCglib...");
	}
}
 

 

2、cglib 代理类:CglibProxy

 

package test.proxy;

import java.lang.reflect.Method;  

import net.sf.cglib.proxy.Enhancer;  
import net.sf.cglib.proxy.MethodInterceptor;  
import net.sf.cglib.proxy.MethodProxy; 

/**
 * cglib动态代理类
 * 
 * @author guweiqiang
 */
public class CglibProxy implements MethodInterceptor {
	private Object target; 
	
	/**
	 * 创建代理对象
	 */
	public Object getInstance(Object obj){
		this.target = obj;
		
		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("事物开始");  
		proxy.invokeSuper(obj, args);
		System.out.println("事物结束");  
		return null;
	}


}
 

 

3、cglib 测试类:CglibTest

 

package test.proxy;

/**
 * cglib 测试类
 * 
 * @author guweiqiang
 */
public class CglibTest {

	public static void main(String[] args) {
		CglibProxy proxy = new CglibProxy();
		CgLibClass cgLib = (CgLibClass) proxy.getInstance(new CgLibClass());
		cgLib.testCglib();
	}
}
 

 

运行结果:

 

事物开始
testCglib...
事物结束

 

 

 

 

 

分享到:
评论

相关推荐

    四、Spring源码分析——动态代理

    - 然后,根据目标对象是否实现接口,Spring决定使用JDK还是CGLIB动态代理。 - 接着,Spring创建一个代理对象,该对象持有目标对象的引用,并关联一个`Advised`对象,该对象包含了关于代理的所有信息,如拦截器链。...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    在Java中,最常用的动态代理实现有两种:JDK Proxy和CGLIB。 - **JDK Proxy**:基于Java反射API实现,仅支持接口的代理。使用JDK Proxy时,需要指定被代理接口的类型,并且代理类必须实现该接口。 - **CGLIB**:...

    浅析Java设计模式【3】——代理.pdf

    ### 浅析Java设计模式【3】——代理 #### 一、代理模式概述 代理模式是一种行为型设计模式,主要用于在客户端与目标对象之间起到一个中介的作用,通过代理对象来控制对目标对象的访问。代理模式的核心在于它可以...

    Java动态代理(Spring Aop原理)

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用方法时添加额外的功能。Spring AOP(面向切面编程)正是利用了这一特性来实现其核心功能——...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    Spring AOP的静态代理和动态代理,转移到调用处理器一个集中的方法中处理.docx

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:基于接口的代理,要求被代理的类必须实现至少一个接口。动态代理通过实现`java.lang.reflect.InvocationHandler`接口并...

    动态代理实现文件.....

    这里我们将深入探讨Java中的两种主要动态代理实现:JDK动态代理和CGLIB动态代理,以及静态代理作为基础概念的介绍。 首先,我们来看静态代理。静态代理是代理模式的一种实现方式,它要求我们为每个目标接口创建一个...

    3个动态代理实例

    在Java编程语言中,动态代理是一种强大的特性,它允许我们在运行时创建代理对象来扩展或增强已有对象的功能。动态代理通常用于实现回调、事件监听、事务管理、性能监控等多种功能。下面我们将深入探讨三个动态代理的...

    Spring cglib 中文说明

    - **动态代理:** 与传统的静态代理不同,CGLIB 可以在运行时动态地生成代理类。 - **支持未实现接口的类:** JDK 动态代理要求代理对象必须实现一个或多个接口,而 CGLIB 则可以直接代理任何实现了非 `final` 方法...

    cglib必需的包

    CGlib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它被广泛应用于Java世界,主要用于动态代理、AOP(面向切面编程)以及优化等场景。在Java开发中,如果你需要用到动态代理或者需要在运行时...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring 使用 `java.lang.reflect.Proxy` 类来创建动态代理,并通过实现 `java.lang.reflect.InvocationHandler` 接口来处理代理对象的方法调用。在 Spring AOP 中,`org.springframework.aop.framework....

    使用动态代理面向切面编程(AOP)

    Java中提供了两种动态代理机制:`java.lang.reflect.Proxy`类和`java.lang.invoke.MethodHandle` API。Proxy类用于基于接口的代理,而MethodHandle API更底层,可以处理不基于接口的代理。 3. **Java Proxy类** -...

    java proxy

    此外,Java还提供了一个JDK动态代理的替代方案——CGLIB(Code Generation Library),它是一个强大的高性能的代码生成库,可以在运行期扩展Java类与实现Java接口。当目标类没有实现接口时,CGLIB可以作为一个很好的...

    Spring Aop面向切面的java代码

    在Spring AOP中,有两种主要的代理方式:JDK动态代理和CGLIB代理。这两种代理方式都是为了实现AOP的核心概念——切面(Aspect)和通知(Advice)。 1. JDK动态代理:JDK动态代理基于Java的接口实现,适用于目标对象...

    spring源码编译时缺少的类cglib,objenesis,castor

    当目标类不支持接口或者用户希望对非接口类型进行代理时,Spring会使用CGLIB生成一个子类来实现动态代理。CGLIB通过字节码技术生成代理类,它可以提供比Java反射API更高的性能。 2. **Objenesis** Objenesis是一个...

    cglib jar文件

    这个jar文件——`cglib-2.2.0.jar`是CGlib库的一个版本,它在软件开发中扮演着至关重要的角色,尤其对于Java开发人员而言。这个版本的发布日期可能是在2010年前后,尽管较早,但它仍然是许多项目中的可靠选择,特别...

    Aop.rar_aop_java aop 例 proxy

    本资源"Aop.rar"包含了一个关于Java AOP的实际应用示例,重点展示了三种主要的代理实现方式:CGLIB、Javassist和Java动态代理。让我们逐一深入了解这三种技术。 1. **CGLIB(Code Generation Library)**: CGLIB...

    spring-cglib-repack 资源

    CGLIB通过字节码技术生成代理类,可以在运行时动态扩展目标类并添加新的方法或属性。`spring-cglib-repack-3.2.6.jar`是Spring框架使用的CGLIB库的打包版本,可能包含了针对某些特定环境或冲突的修复。 其次,`...

    java面试——深圳-乐信-Java高级.zip

    - AOP的实现:动态代理(JDK、CGLIB)和AspectJ。 - Spring Boot的自动配置原理,Spring Cloud相关组件。 以上内容是Java高级面试中可能涉及的关键知识点,深入理解和掌握这些知识将有助于在面试中表现出色。

    spring的二次代理原因及如何排查

    2. **识别代理类型**:确定是JDK动态代理还是CGLIB代理,这有助于理解代理是如何工作的。 3. **检查配置**:查看Spring的AOP配置,确保没有不必要的重复代理设置。 4. **测试隔离**:尝试去掉一个代理,看看问题是否...

Global site tag (gtag.js) - Google Analytics