[英]How to instantiate an inner class with reflection?
我想獲得一個嵌套類的構造函數,以便可以實例化它。 我希望這是一個內部類,以便我可以從其外部類訪問變量。
下面的代碼拋出NoSuchMethodException,並添加了inner
前綴:
package com.example
import android.util.Log
class ClassA {
var iWantToUseThisFromTheInnerClass = "someValue"
fun runThisToStart() {
val classB = ClassB(InnerClassA::class.java)
classB.doSomething()
}
inner class InnerClassA(text: String) {
init {
Log.d("InnerClassA", "Constructor invoked " + text)
}
}
}
package com.example
import java.lang.reflect.InvocationTargetException
class ClassB<T>(private var mModelClass: Class<T>) {
val someText = "whatever"
fun doSomething():T {
try {
val constructor = mModelClass.getConstructor(String::class.java)
return constructor.newInstance(someText)
} catch (e: NoSuchMethodException) { // Throws this exception
throw RuntimeException(e)
} catch (e: InvocationTargetException) {
throw RuntimeException(e)
} catch (e: InstantiationException) {
throw RuntimeException(e)
} catch (e: IllegalAccessException) {
throw RuntimeException(e)
}
}
}
謝謝
您還需要在構造函數中包括封閉類(ClassA)實例,因為如果沒有它,InnerClassA將不存在:
class ClassA {
var iWantToUseThisFromTheInnerClass = "someValue"
fun runThisToStart() {
val classB = ClassB(InnerClassA::class.java)
classB.doSomething(this)
}
inner class InnerClassA(text: String) {
init {
// Log.d("InnerClassA", "Constructor invoked " + text)
}
}
}
class ClassB<T>(private var mModelClass: Class<T>) {
val someText = "whatever"
fun doSomething(enclosingObj : Any):T {
val constructor = mModelClass.getConstructor(enclosingObj::class.java, String::class.java)
return constructor.newInstance(enclosingObj, someText)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.