我在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"
}
}
答案 0 :(得分:0)
kotlin方法的默认选项是final
。
原因是introduce
方法无法扩展。
使用界面时,默认选项为open
,因此可以扩展。
gradle插件kotlin-spring
仅用于春季注释。
它不适用于抽象类。