java之CGLIB动态代理

本文介绍了CGLIB动态代理的原理及优势,并通过具体示例展示了如何使用CGLIB库实现代理模式,包括创建代理类、拦截方法调用等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

© 版权声明:本文为博主原创文章,转载请注明出处

CGLIB动态代理:

  CGLIB动态代理就是对指定的类生成一个子类,覆盖其中所有的方法并环绕增强

优势:

  - 1. 业务类只需要关注业务逻辑本身,保证了业务类的重用性

  - 2. 只需一个动态代理类就可以代理很多类,大大减少了代理类的规模,便于维护

  - 3. 接口变了,动态代理类也不需要任何改动

  - 4. 可以代理没有实现任何一个接口的类

劣势:

  - 1. 不可以对final修饰的类或方法进行代理

实例:

1.项目结构

2.pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  
  	<modelVersion>4.0.0</modelVersion>

	<groupId>org.proxy</groupId>
	<artifactId>DynamicProxy-CGlib</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<!-- Junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- CGLIB -->
		<dependency>
		    <groupId>cglib</groupId>
		    <artifactId>cglib</artifactId>
		    <version>3.2.5</version>
		</dependency>
	</dependencies>
	
</project>

3.Hello.java

package org.proxy.DynamicProxy_CGlib;

public class Hello {
    
	public void say(String name) {
		
		System.out.println("Hello!" + name);
		
	}
	
}

4.CGLibProxy.java

package org.proxy.DynamicProxy_CGlib;

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 CGLibProxy implements MethodInterceptor {

	private static CGLibProxy instance = new CGLibProxy();
	
	private CGLibProxy() {
	
	}
	
	public static CGLibProxy getInstance() {
		
		return instance;
		
	}
	
	@SuppressWarnings("unchecked")
	public <T> T getProxy(Class<T> cls) {
		
		return (T) Enhancer.create(cls, this);
		
	}
	
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		
		before();
		Object result = proxy.invokeSuper(obj, args);
		after();
		return result;
		
	}
	
	private void before() {
		
		System.out.println("Before");
		
	}
	
	private void after() {
		
		System.out.println("After");
		
	}

}

5.TestCGLibDynamicProxy.java

package org.proxy.test;

import org.junit.Test;
import org.proxy.DynamicProxy_CGlib.CGLibProxy;
import org.proxy.DynamicProxy_CGlib.Hello;

public class TestCGLibDynamicProxy  {
	
	@Test
	public void testHello() {
		
		Hello helloProxy = CGLibProxy.getInstance().getProxy(Hello.class);
		helloProxy.say("Jack");
		
	}
	
}

6.效果预览

 

参考:《架构探险-从零开始写Java Web框架》(黄勇著)

转载于:https://www.cnblogs.com/jinjiyese153/p/6933362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值