我在Spring中使用ProxyFactory创建了2个代理对象。一个代理对象使用的接口和一个代理对象未使用的接口。但不能使用jdk动态代理。所有代理对象都使用cglib。实现接口代理对象调用real方法。未实现接口的代理对象具有意外结果。两个cglib代理对象有什么区别?两者之间唯一的区别是界面。
// Not implement interface
open class Person: AbstractPerson() {
}
abstract class AbstractPerson(var age: Int? = null,
var name: String? = null) {
fun init() {
this.age = 31
this.name = "LichKing"
}
fun introduce(): String = "age: $age name: $name"
}// Implement interface
open class PersonImpl: AbstractPersonImpl() {
}
abstract class AbstractPersonImpl(var age: Int? = null,
var name: String? = null): PersonInterface {
fun init() {
this.age = 31
this.name = "LichKing"
}
override fun introduce(): String = "age: $age name: $name"
}
interface PersonInterface {
fun introduce(): String
}// Test
class PersonTest {
@Test
fun implementInterface() {
val p = PersonImpl()
p.init()
val proxyFactory: ProxyFactory = ProxyFactory()
proxyFactory.setTarget(p)
val proxy = proxyFactory.proxy as PersonImpl
println(proxy.javaClass)
println(proxy.introduce()) // "age: 31 name: LichKing"
}
@Test
fun notImplementInterface() {
val p = Person()
p.init()
val proxyFactory: ProxyFactory = ProxyFactory()
proxyFactory.setTarget(p)
val proxy = proxyFactory.proxy as Person
println(proxy.javaClass)
println(proxy.introduce()) // "age: null name: null"
}
}发布于 2019-05-19 20:19:01
kotlin方法的默认选项是final。原因是introduce方法未被扩展。在使用接口时,默认选项是open,因此它可以扩展。
gradle plugin kotlin-spring只用于spring注解。它不适用于抽象类。
https://stackoverflow.com/questions/56206082
复制相似问题