`
raymond.chen
  • 浏览: 1418653 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用CGLIB对实现类进行动态代理

    博客分类:
  • Java
 
阅读更多

CGLIB(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。

 

JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现。

 

不能对final类以及final方法进行代理。

 

定义实现类:

public class UserServiceImpl {
	public User getUserById(Long id){
		return new User(id, "cjm", "123", null);
	}
}

 

定义基于CGLIB的动态代理类,需要实现MethodInterceptor接口

public class UserServiceImplCGLIB implements MethodInterceptor {
	@SuppressWarnings("unchecked")
	public <T> T getInstance(Object target, Class<T> clazz) {
		//字节码加强器:用来创建动态代理类
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(target.getClass()); //代理的目标对象
		enhancer.setCallback(this); //回调类,在代理类方法调用时会回调Callback类的intercept方法
		
		Object result = enhancer.create(); //创建代理类
		System.out.println(result.getClass().getName());
		
		return (T)result;
	}
	
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		//对目标方法进行拦截处理
		System.out.println("start...");
		Object result = proxy.invokeSuper(obj, args); //调用目标类(父类)的方法
		System.out.println("end");
		return result;
	}
}

 

测试代码:

public class Test {
	public static void main(String[] args) {
		UserServiceImpl userService = new UserServiceImpl();
		UserServiceImplCGLIB cglib = new UserServiceImplCGLIB();
		UserServiceImpl proxy = cglib.getInstance(userService, UserServiceImpl.class);
		
		User user = proxy.getUserById(100L);
		
		String username = Optional.of(user).map(u -> u.getUsername()).orElse("");
		System.out.println(username);
	}
}

 

分享到:
评论

相关推荐

    cglib创建代理类.rar

    springAOP等框架中,大量用到代理技术;...两类代理技术: 1,java动态代理,见JDK文档或相关java书; 2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单

    CGLIB动态代理类库

    使用CGLIB扩展对象行为的原理是:对目标对象进行继承扩展,为其生成相应的子类,而子类可以通过覆写来扩展父类的行为,只要将横切逻辑的实现放到子类中,然后让系统使用扩展后的目标对象的子类,就可以达到与代理...

    简单实现Cglib子类代理

    Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。如果想代理没有实现接口的类,就可以使用CGLIB实现。这是一个简单的案例。

    cgLib与JDK动态代理的用法

    代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以...

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    cglib.jar下载

    通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 二、CGLIB原理 CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。...

    java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】

    java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】 /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用...

    cglib包及依赖汉cglib3.1和asm4.2

    cglib包及依赖汉cglib3.1和asm4.2,主要作用是...JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包

    Java中的Cglib动态代理jar.7z

    Cglib动态代理技术对目标对象有没有实现接口,没有要求. Cglib动态代理技术,是通过拷贝然后修改目标对象的类的字节码来产生一个代理对象 而且这个Cglib产生的代理对象实例 是 目标对象的一个子类.

    JDK动态代理(AOP)使用及原理分析视频教程课件

    动态代理是使用jdk的反射机制,创建对象的...jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理。 动态代理可以在不改变原来目标方法功能的前提下, 可以在代理中增强自己的功能代码。

    你必须会的 JDK 动态代理和 CGLIB 动态代理

    我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性。 通过从静态代理、JDK 动态代理、CGLIB 动态代理来进行本文的分析。 静态...

    cglib必须导入的包和案例

    JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现. Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的...

    动态代理中clig包(Cglib代理模式).zip

    2) 在内存中动态构建子类,注意代理的类不能为final,否则报错 java.lang.IllegalArgumentException: 3) 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的 业务方法.

    Spring框架+SpringAOP动态代理

    SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB ...CGLIB(Code Generation Library)是一个代码生成的类库,可以在运行时动态生成一个目标类的子类,并覆盖其中的方法来实现代理。

    cglib 和asm jar包

    jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,...

    cglib-3.2.0.jar

    最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和jMock是通过使用模仿(mock)对象来测试java代码的包。它们都通过...

    Java动态代理两种实现方式

    Java实现动态代理的两种方式。 相对来说cglib更加方便。可以实现为实现接口的类(非final类)

    基于java的企业级应用开发:JDK动态代理.ppt

    CGLIB代理 通过前面的学习可知,JDK的动态代理用起来非常简单,但它是有局限性的,使用动态代理的对象必须实现一个或多个接口。 那么,如何代理没有实现接口的类? CGLIB代理 CGLIB(Code Generation Library)是一...

    cglib__jar包.zip

    cglib可以帮助java动态生成类,用动态代理需要实现接口,只用cglib不用asm会发生找不到类的异常,cglib在spring项目中也有使用

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

Global site tag (gtag.js) - Google Analytics