`

CGLIB实现代理demo

阅读更多
在上片文章里说了如何用jdk自带的类Proxy来实现代理,但是在使用Proxy时要注意:目录类必须实现接口,如果目标类没有实现接口的话,可以用cglib.jar类实现代理。
1、首先从网上找到cglib进行下载,我这里用的是cglib-nodep-2.1_3.jar
2、新建java项目 CGLIBAop
2、在项目中创建程的Person.java
package cn.ehoo.bean;

/**
 * @author whp
 * @Email whp@ehoo.cn
 * @Jan 4, 2011
 * 
 */
public class Person {
	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}


2、创建目标类PersonServiceBean.java
PersonServiceBean.java
package cn.ehoo.service.impl;

import cn.ehoo.bean.Person;

/**
 *@author whp
 *@Email whp@ehoo.cn
 *@Jan 4, 2011
 *
 */
public class PersonserviceBean {
	private String user;
	public String getUser() {
		return user;
	}
	public void setUser(String user) {
		this.user = user;
	}
	public PersonserviceBean() {
		super();
	}
	public PersonserviceBean(String user) {
		super();
		this.user = user;
	}
	public void save(Person person){
		System.out.println("执行PerServiceBean的save方法");
	}
}


3、创建代理类
package cn.ehoo.aop;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import cn.ehoo.service.impl.PersonserviceBean;

/**
 * @author whp
 * @Email whp@ehoo.cn
 * @Jan 4, 2011
 * 
 * 
 */
public class CGLIBFactory implements MethodInterceptor {
	Object targetObject;// 目标对象

	public Object createCglibIntenc(Object targetObject) {
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();//通过类Enhancer创建代理对象
		enhancer.setSuperclass(this.targetObject.getClass());//传入创建代理对象的类
		enhancer.setCallback(this);//设置回调
		return enhancer.create();//创建代理对象

	}

	@Override
	public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
		PersonserviceBean bean = (PersonserviceBean) targetObject;// 因为在程序里targetObject为PersonServiceBean
		Object result = null;
		if (bean.getUser() != null)// 判断user是否为空
			result = method.invoke(targetObject, args);// 如果不为空交给目标对象进行处理.
		// TODO Auto-generated method stub
		return result;
	}

}



4、cglib与Proxy的主要区别是cgilib创建代理不需要目标类实现接口,但Proxy类需要目标类实现接口。
分享到:
评论

相关推荐

    java cglib和反射demo

    1. **CGLib实现AOP** 首先,定义一个接口或抽象类(例如`MyService`),然后创建其实现类(例如`MyServiceImpl`)。接下来,我们需要创建一个`MethodInterceptor`,这是CGLib的核心,它会在目标方法执行前后进行...

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

    CGLIB(Code Generation Library)是在运行期间生成子类来实现代理,因此它适用于没有实现接口的类。CGLIB是一个强大的高性能的代码生成库,它在许多AOP框架中如Spring AOP中被使用。以下是CGLIB的一些关键知识点: ...

    spring-demo20-CGLIB动态代理.zip

    本示例"spring-demo20-CGLIB动态代理.zip"主要展示了如何使用CGLIB库在Spring框架中实现动态代理。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP框架中被使用,如Spring AOP和...

    CGLIB demo

    在这个例子中,我们创建了一个CGLIB代理对象,当调用`myMethod()`时,会在调用前后分别打印"Before method execution"和"After method execution",实现了方法的拦截。 总的来说,CGLIB作为Java中的一个强大工具,...

    asm + cglib demo

    1. **代理实现**: CGlib通过创建目标类的子类来实现代理,从而可以在子类的方法中插入切面代码,达到AOP的效果。 2. **性能优势**: 相比于使用Java反射,CGlib通过字节码技术提高了方法调用的效率。 3. **简单易用**...

    AOP 动态代理demo

    在"AOP 动态代理demo"项目中,我们可以预期看到以下几个方面的内容: 1. **代理对象的创建**:无论是JDK动态代理还是CGLIB,都需要创建代理对象。对于JDK动态代理,这通常涉及到`Proxy.newProxyInstance()`方法的...

    Spring如何基于Proxy及cglib实现动态代理

    总的来说,Spring中的动态代理是通过Java Proxy或cglib来实现的,它们都提供了一种在不修改原有代码的情况下,对方法调用进行拦截和扩展的机制。Java Proxy适用于目标对象实现了接口的情况,而cglib则适用于没有接口...

    java 动态代理实例(JDK代理与CGLIB代理)

    在附件的"demo"中,可能包含了这两个代理方式的示例代码,包括如何创建和使用代理对象,以及如何在`InvocationHandler`或`MethodInterceptor`中添加自定义逻辑。通过阅读和理解这些代码,你可以更深入地了解Java动态...

    java 代理demo

    CGlib(Code Generation Library)是另一个常用的动态代理库,它基于ASM库,能够在运行时动态生成子类来实现代理。CGlib适用于没有实现接口的类,因为JDK动态代理只能代理实现了接口的类。以下是一个使用CGlib创建...

    Cglib Demo

    Cglib是一个强大的高性能的代码生成库,它在Java运行时可以动态地创建子类对象,从而实现对方法的拦截。Cglib是基于ASM这个底层字节码操作框架的,它广泛应用于许多AOP(面向切面编程)的框架中,如Spring AOP和...

    代理模式Demo

    在这个“代理模式Demo”中,我们将深入探讨代理模式的概念、作用以及如何通过代码实现。 1. **代理模式的基本概念** 代理模式属于结构型设计模式,它创建了一个代理对象来控制对原对象的访问。代理对象与目标对象...

    SpringAop学习笔记以及实现Demo

    1. **经典代理模式Demo**:演示了如何通过CGLIB代理实现方法的拦截,以及在方法调用前后执行自定义操作。 2. **基于注解的AOP Demo**:展示了如何在切面类中使用注解定义通知,并在运行时自动织入切面。 3. **基于...

    JavaProxy Demo

    总结来说,"JavaProxy Demo"是一个介绍和演示Java动态代理技术的实例,包括JDK和CGLIB两种实现方式,以及它们在实际场景中的应用。通过学习和分析这个Demo,开发者可以深入理解动态代理的概念,掌握如何在项目中利用...

    Java代理实战Demo

    CGLIB是通过创建目标类的子类来实现代理的,因此对于没有接口的类,CGLIB是更好的选择。CGLIB的核心是`net.sf.cglib.proxy.Enhancer`类和`MethodInterceptor`接口。 1. 创建Enhancer实例,并设置回调对象,通常是...

    动态代理原理实例Demo

    `ClassLoader`用于加载代理对象,`Interface[]`是代理对象需要实现的接口列表,`InvocationHandler`则处理代理对象的所有方法调用。 2. **InvocationHandler接口** - `InvocationHandler`接口定义了一个方法`...

    JDKProxy:用来理解jdk基于接口的动态代理和cglib基于类代理区别的demo

    CGLIB代理的一个常见用途是在Spring AOP中,当目标对象没有实现接口时,Spring会自动选择CGLIB作为代理机制。然而,CGLIB的缺点是它比JDK代理稍微慢一些,且代理对象的创建需要更多的内存资源,因为涉及到类的继承。...

    SpringXML方式实现AOP demo

    标题 "SpringXML方式实现AOP demo" 涉及到的是使用Spring框架通过XML配置来实现面向切面编程(AOP)的知识。面向切面编程是Spring框架的一个核心特性,它允许开发者在不修改原有业务代码的情况下,对系统进行横切...

    AOPTest_CGlib

    **CGlib** 是AOP实现的一个重要工具,它通过动态代理技术来增强目标类。在Java中,如果一个类没有接口,JDK的动态代理就无法工作。这时,CGlib就派上用场了,它通过字节码技术创建目标类的子类,然后在子类中添加...

Global site tag (gtag.js) - Google Analytics