cglib代理的区别实现接口是什么?

时间:2019-05-19 08:35:01

标签: spring-boot kotlin cglib

我在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"
    }
}

1 个答案:

答案 0 :(得分:0)

kotlin方法的默认选项是final。 原因是introduce方法无法扩展。 使用界面时,默认选项为open,因此可以扩展。

gradle插件kotlin-spring仅用于春季注释。 它不适用于抽象类。