`

cglib动态代理

阅读更多

       Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。

       切入点一般是方法调用之前,之后或者两端。

1、要代理的类

package com.yt.manager.proxy;

public class ServicesImpl {

	public void outPut() {
		// TODO Auto-generated method stub
		System.out.println("to run outPut method..............");
	}

	public void putOut() {
		// TODO Auto-generated method stub
		System.out.println("to run putOut method..............");
	}

	public void outPut1(String v) {
		System.out.println("参数内容:" + v);
	}

}

 2、cglib代理类

package com.yt.manager.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动态代理 intercept(Object obj, Method method, Object[] args,MethodProxy
 * proxy) 是CGLib定义的Inerceptor接口的方法,obj表示代理后的子类 , method为父类方法的反射对象,args为方法的动态入参,
 * 而proxy为代理类实例。一般使用 proxy进行调用父类方法,这样更快。
 * @author zxf
 * 
 */
public class CGlibProxyFactory implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();

	public Object getProxy(Class c) {
		enhancer.setSuperclass(c); // ① 设置需要创建子类的类
		enhancer.setCallback(this);
		return enhancer.create(); // ②通过字节码技术动态创建子类实例
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		before();
		arg3.invokeSuper(arg0, arg2);
		end();
		return null;
	}

	public void before() {
		System.out.println("--------在调用要代理类的方法前做的处理----------");
	}

	public void end() {
		System.out.println("--------在调用要代理类的方法后做的处理----------");
	}

}

 3、测试调用

package com.yt.manager.proxy;

/**
 * 调用代理测试类
 * @Description: 
 * @ClassName: TestProxy
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-5-19
 */
public class TestProxy {

	public static void main(String[] args) {
		//cjlib基于类的代理
		ServicesImpl serviceImp = (ServicesImpl) new CGlibProxyFactory().getProxy(ServicesImpl.class);
		serviceImp.outPut();

	}
}

intercept(Object obj, Method method, Object[] args,MethodProxy proxy)是CGLib定义的Inerceptor接口的方法,obj表示代理后的子类 ,method为父类方法的反射对象,args为方法的动态入参, 而proxy为代理类实例。一般使用 proxy进行调用父类方法,这样更快。

分享到:
评论
1 楼 guoxiaobing 2011-10-09  

相关推荐

    Jdk动态代理和cglib动态代理原理

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

    cglib动态代理介绍

    CGlib则是Java动态代理的一种实现方式,尤其是在不提供接口的情况下,它通过生成目标类的子类来实现动态代理。 在Java中,JDK自带的动态代理机制是基于接口的,如果被代理的类没有实现任何接口,那么就无法使用JDK...

    AOP之JDK动态代理和CGLib动态代理

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

    jdk与cglib动态代理与底层实现

    - **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践,帮助开发者深入理解并掌握这些技术。 首先,让我们来探讨JDK动态代理。Java标准库中的`java.lang.reflect.Proxy`类和`...

    Spring框架中JDK动态代理和cglib动态代理

    Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...

    cglib动态代理jar包

    CGlib动态代理是Java开发中一个非常重要的工具库,它主要用来实现代理模式,尤其在面向切面编程(AOP)中发挥着关键作用。CGlib是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGlib并不...

    转载:cglib动态代理介绍(一)

    - 如果目标类中包含静态方法,CGlib代理不会影响静态方法的行为。 总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者...

    基于MAVEN项目的CGLib动态代理原理及实现

    本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...

    jdk和cglib动态代理的例子{jar包+源码}

    jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    CGlib动态代理类的jar包

    CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...

    CgLib动态代理所需的jar

    CgLib就是实现这种动态代理的一个工具,特别是在不支持接口的类上。 CgLib的核心功能是通过字节码技术创建子类。当目标类没有实现接口时,Java的标准动态代理机制JDK Proxy就无法工作,因为JDK Proxy是基于接口的。...

    静态代理、jdk动态代理、cglib动态代理

    Cglib 动态代理的实现方式是:我们首先需要定义一个类,然后使用 Cglib 库来生成该类的代理对象,该代理对象将拦截对被代理对象的所有方法调用,并控制对被代理对象的访问。 Cglib 动态代理的优点是:它的实现方式...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

    cglib动态代理相关包

    CGlib是Java编程语言中的一个库,主要用于生成子类,以提供方法拦截和动态代理功能。它是对Bytecode Generation Library(字节码生成库)的一个封装,能够在运行时动态创建新类和对象,广泛应用于AOP(面向切面编程...

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...

    JDK动态代理和Cglib动态代理实例源码

    本篇将详细探讨JDK动态代理和Cglib动态代理,并通过源码实例来加深理解。 首先,JDK动态代理是Java内置的一种机制,它依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类...

    cglib动态代理用到的两个包

    当无法或者不想使用Java标准的JDK动态代理(只能代理接口实现类)时,CGLib可以生成目标类的子类来实现对目标对象的代理。这个过程中,CGLib的核心类`Enhancer`起到了关键作用。`Enhancer`允许开发者指定被代理的...

Global site tag (gtag.js) - Google Analytics