cglib代理接口及mybatis接口的实现原理
关于cglib代理的概念和原理以及常用api,请参考:
- 初步探究cglib动态代理的原理:http://www.jiajiajia.club/blog/artical/yjw520/134
- cglib动态代理底层实现分析java:http://www.jiajiajia.club/official/weblog/yjw520/34
- cglib代理常用接口和api: http://www.jiajiajia.club/blog/artical/4t4q4za0uoo6/488
InvocationHandler可以实现对接口的代理,类似与mybatis,代码中开发者只需要写一个接口和一个xml,mybatis会根据xml的描述信息,帮你生成对应的方法实现,参数的解析、sql的生成、发送、结果集的封装等都不用开发者去写。而其中的原理就是利用了代理模式。cglib对此有很好的实现方案。
首先定义一个接口,这个接口里有各种返回值类型的方法。
import java.util.List;
public interface TestInterface {
String testString(Integer id);
int testInt(String value);
List testList(Integer age,Integer g);
SampleClass testSampleClass();
}
用代理模式去实现这些方法。实现类交由cglib去动态创建。
import net.sf.cglib.proxy.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class test2 {
public static void main(String[] args) {
Class[] classes = {TestInterface.class};
Enhancer enhancer = new Enhancer();
enhancer.setInterfaces(classes);
CallbackHelper callbackHelper = new CallbackHelper(Object.class, classes) {
@Override
protected Object getCallback(Method method) {
// 只代理TestInterface中的方法
if(method.getDeclaringClass() == TestInterface.class){
return new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.print("参数:");
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println();
Class<?> returnType = method.getReturnType();
if (returnType == int.class || returnType == Integer.class) {
// 返回值类型是整数类型
return 1;
}else if(returnType == String.class){
// 返回值类型是字符串
return "string";
}else if(returnType == List.class){
// 返回值类型是集合
ArrayList arrayList = new ArrayList();
arrayList.add("11");
return arrayList;
}
// ... 等等
else{
// 自定义类型
return returnType.newInstance();
}
}
};
}else{
// 什么都不做
return NoOp.INSTANCE;
}
}
};
enhancer.setCallbackFilter(callbackHelper);
enhancer.setCallbacks(callbackHelper.getCallbacks());
TestInterface proxy = (TestInterface) enhancer.create();
System.out.println("返回值:"+proxy.testInt("123"));;
System.out.println("返回值:"+proxy.testList(1,1));;
System.out.println("返回值:"+proxy.testString(1));;
System.out.println("返回值:"+proxy.testSampleClass());;
}
}
评论区
请写下您的评论...
猜你喜欢
blog
cglib代理常用接口和api
ASM,java基础
1100
、InvocationHandler InvocationHandler可以实现对接口的代理,类似与mybatis,代码中开发者只需要写一个接口和一个xml,mybatis会根据xml的描述信息,帮你生成对应的方法实现,参数的解析
blog
初步探究cglib动态代理的原理
java基础
3443
初步探究cglib动态代理的原理之前我们说了一下jdk动态代理的原理http://www.jiajiajia.club/weblog/blog/artical/60本章说一下cglib动态代理,做个
算法基础
2137
如果一个类实现了一个接口,如何获取接口中泛型的实际类型importjava.lang.reflect.ParameterizedType;
importjava.lang.reflect.Type
weblog
4869
前言
好久就开始关注cglib动态代理了,但是到今天才算是有点搞明白~cglib动态代理底层用到了asm等字节码操作框架。不懂的可以先百度百度asm是干啥的,在这里也提供一些文章,但是可能比较深入
official
2837
理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中。 接口声明如下:publicinterfaceBeanPostProcessor{@Nullabledef
nginx
3264
超过60秒(默认)没有活动的套接字,并将其断开连接。
解决方法
一、修改nginx代理超时时间
时间根据实际需求配置,单位秒
proxy_read_timeout86400s;
proxy_send_
blog
java集合之TreeMap实现原理
java基础
2038
java集合之TreeMap实现原理TreeMap集合的实现其实说简单也简单说复杂也复杂,说简单是因为TreeMap底层实现完全依靠红黑树这个数据结构,相比与HashMap来说TreeMap不用考虑
blog
java抽象类和接口知识点总结
java基础
2013
参数 抽象类 接口 默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现 实现 子类使用extends关键字来继承
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。