微服务 教程
1085个小节阅读:196.5k
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
CGLib动态代理简化了JDK动态代理的写法,JDK是针对接口代理,而CGLib是针对类代理。
xxxxxxxxxx
<!-- 引入cglib依赖 -->
<dependencies>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
// 被代理类
public class Apple{
public String sell(double price) {
System.out.println("产品卖了"+price+"元");
return "iphone13";
}
public void repair() {
System.out.println("苹果售后维修");
}
}
// 代理方式类,实现MethodInterceptor接口,重写intercept方法
public class ShoppingProxy implements MethodInterceptor {
private Apple apple; // 被代理对象
public ShoppingProxy(Apple apple) {
this.apple = apple;
}
/**
* 定义原方法的增强方式
* @param o 被代理对象
* @param method 被代理对象调用的方法
* @param objects 被代理对象调用的方法时,传入的参数
* @param methodProxy 底层生成的代理类的引用
* @return 方法的返回值
* @throws Throwable
*/
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
String name = method.getName();
if("sell".equals(name)){
double price = (double)objects[0]*0.8;
Object result = method.invoke(apple, price);
return result+"和数据线";
}else if("repair".equals(name)){
System.out.println("专属客服为您服务!");
return method.invoke(apple,objects);
}else{
return method.invoke(apple,objects);
}
}
}
public class Test {
public static void main(String[] args) {
// 被代理对象
Apple apple = new Apple();
// 代理方式
ShoppingProxy shoppingProxy = new ShoppingProxy(apple);
// 生成代理对象
Apple appleTB = (Apple) Enhancer.create(Apple.class, shoppingProxy);
// 执行增强后的方法
String sell = appleTB.sell(9000);
System.out.println(sell);
appleTB.repair();
}
}
1. 关于CGLib实现动态代理,说法正确的是?
A 是针对类进行代理。
B 是针对接口进行代理。
C 不需要额外引入依赖。
D 会生成代理类。
1=>A