В чем отличие реализации интерфейса на cglib proxy? - PullRequest
1 голос
/ 19 мая 2019

Я сделал 2 прокси-объекта, используя ProxyFactory в Spring.Один прокси-объект использовал интерфейс и один прокси-объект не использовал интерфейс.но не работает динамический прокси jdk.Весь прокси-объект используется cglib.Прокси-объект, реализующий интерфейс, вызывает реальный метод.Прокси-объект, который не реализует интерфейс, имеет неожиданный результат.В чем разница между двумя прокси-объектами 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 голосов
/ 19 мая 2019
Параметр

по умолчанию для метода Котлина - final.Причина в том, что introduce метод не может быть расширен.опция по умолчанию open при использовании интерфейса, поэтому его можно расширить.

плагин gradle kotlin-spring предназначен только для весенних аннотаций.Это не работает для абстрактного класса.

...