https://kotlinlang.org logo
#russian
Title
# russian
a

Alexjok

10/11/2018, 7:59 AM
Всем привет! Подскажите пожалуйста, как вызвать private fun isFun(ok: String): Boolean из другого класса при помощи рефлексии.
g

gildor

10/11/2018, 8:11 AM
должно быть тоже самое как любой другой приватный метод, найти рефлексией в классе, выставить setAccesible(true) и вызвать после этого через method.invoke
a

Alexjok

10/11/2018, 8:26 AM
Вроде как да Вот два варианта и оба не работают: 1) val met = NewsServiceImpl() val f = NewsServiceImpl::class.functions.find { it.name == "statusIsNotValid" } f?.let { it.isAccessible = true it.call("draft") } 2) val method = NewsServiceImpl().let { it.javaClass .getDeclaredMethod("statusIsNotValid") .apply { isAccessible = true } .invoke(it, "draft") }
g

gildor

10/11/2018, 8:29 AM
что конкретно не работает?
и точно метод statusIsNotValid объявлен в NewsServiceImpl, а не в одном из его пэрентов
a

Alexjok

10/11/2018, 8:34 AM
Объявлен в NewsServiceImpl. Не вызывается падает с exception, в первом случае "Callable expects 2 arguments, but were 1 provided" и не пойму, что я должен еще туда передать, если на входе только стринг. Во втором случае просто не видит метода NoSuchMethodException.
метод private
g

gildor

10/11/2018, 8:42 AM
аааа
я понял почему во втором случае не работает
getDeclaredMethod имеет же доп аргмент vararg
там нужно типы параметров передавать
короче если хочется просто по имени, то только искать в массиве getDeclaredMethods()
a

Alexjok

10/11/2018, 8:44 AM
Да!
g

gildor

10/11/2018, 8:44 AM
В данном случае нужно что-то типо
Copy code
.getDeclaredMethod("statusIsNotValid", String::class.java)
a

Alexjok

10/11/2018, 8:44 AM
Заработало, спасибо!)
l

lex

10/11/2018, 10:03 AM
в первом варианте call() вроде должен первым параметром принмать объект, на котором будет вызываться метод, потом парамерты
👍 1
так же как
.invoke(it, "draft")
13 Views