Java动态代理

JDK动态代理

通过java.lang.reflect.Proxy可以实现动态代理,但是这种方式只能作用于接口,如果一个类没有接口则无法实现动态代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
//Interface是一个接口,InterfaceImpl是接口的实现类
val delegate = InterfaceImpl()
val proxy = Proxy.newProxyInstance(Interface::class.java.classLoader, arrayOf(Interface::class.java)
) { proxy, method, args ->
if (method.name == "testMethod") {
//可以打印日志等
}
if (args != null) {
method.invoke(delegate, *args)
} else {
method.invoke(delegate)
}
} as Interface

CGLIB实现动态代理

CGLIB通过动态生成一个代理类的子类来提供代理。但是对于final方法,是无法实现代理的。

参考

CGLIB(Code Generation Library) 介绍与原理
动态代理底层实现