Java基础之《cglib动态代理》

1、介绍
1)cglib动态代理是一个第三方库
2)既可以代理接口,也可以代理类
3)因为它是动态生成被代理类的子类

4、cglib动态代理和JDK中的动态代理的区别
JDK中所要进行动态代理的类必须要实现一个接口,使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。

5、步骤
第一步:被代理类中的方法不能是final修饰的类
第二步:定义一个拦截器。在调用目标方法时,CGLib会回调MethodInterceptor接口方法拦截,来实现你自己的代理逻辑,类似于JDK中的InvocationHandler接口
第三步:生成动态代理类

RealSubject类

package myTest2;

/**
 * 被代理类
 */
public class RealSubject {

	public void rent() {
		System.out.println("I want to rent my house");
	}
 
	public void hello(String str) {
		System.out.println("hello: " + str);
	}

}

SubjectProxy类

package myTest2;

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class SubjectProxy implements MethodInterceptor {

	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("before: " + method.getName());
		//注意这个地方是invokeSuper,而不是invoke,调用invoke会出现递归自调用,然后一直被拦截在方法调用前。最后栈溢出
		//这里的obj参数是cglib new出来的被代理对象的子类
		Object object = proxy.invokeSuper(obj, args);
		System.out.println("after: " + method.getName());
		return object;
	}
}

CglibTest类

package myTest2;

import org.springframework.cglib.proxy.Enhancer;

public class CglibTest {

	public static void main(String[] args) {
		// 新建一个增强器对象
        // Enhancer类是CGLib中的一个字节码增强器
		Enhancer enhancer = new Enhancer();
		// 继承被代理类
		enhancer.setSuperclass(RealSubject.class);
		// 设置已经实现的方法拦截器到回调函数中
		// cglib会回调重写的intercept方法
		enhancer.setCallback(new SubjectProxy());
		// 创建代理后的类对象
		// 第一步:生成源代码
		// 第二步:编译生成class文件
		// 第三步:classloader进jvm
		RealSubject realSubject = (RealSubject) enhancer.create();

		realSubject.rent();
		realSubject.hello("233");
	}
}

 执行结果:

before: rent
I want to rent my house
after: rent
before: hello
hello: 233
after: hello

 参考资料:
https://blog.csdn.net/baidu_39322753/article/details/100074469
https://blog.csdn.net/lf1013667686/article/details/88385553

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值