Tag: 反射

如何从KClass反射Kotlin类型推断?

在下面的代码中,我无法正确地安排输入/输出,以至于()和()都按预期工作。 我已经尝试在属性和函数参数中切换进/出,但总是以不正确的输入错误结束。 class KStateMachine(private val states: List<StateHandler>) { var currentState: KClass<out StateHandler> private set private val handlers:HashMap<KClass<in StateHandler>, Int> = HashMap() init { currentState = states[0]::class for (i in 0..states.size – 1) { handlers.put(states[i]::class, i) } } fun goto(toState: KClass<in StateHandler>) { var index = handlers.get(toState) if (index != null) { var oldState = currentState […]

用于Kotlin方法的Java注释的getAnnotation返回null

说,我有以下界面: interface AppRepository : GraphRepository<App> { @Query("""MATCH (a:App) RETURN a""") fun findAll(): List<App> } 在测试中,我想检查查询字符串的具体情况,因此我做 open class AppRepositoryTest { lateinit @Autowired var appRepository: AppRepository @Test open fun checkQuery() { val productionMethod = appRepository.javaClass.getDeclaredMethod("findAll") val productionQuery = productionMethod!!.getAnnotation(Query::class.java) //demo test assertThat(productionQuery!!.value).isNotEmpty() //KotlinNPE } } 由于我不理解的原因, productionQuery是null 。 我已经双重检查了测试类中导入的Query的类型和存储库中的Query是相同的。 因此,在这种情况下为什么productionQuery null ?

Kotlin:我如何使用包装上的反射?

我如何使用包级函数,成员等的思考? 尝试访问javaClass或class不起作用, package也没有。

Kotlin,如何通过反射检索字段值

所以我在几个类中有数百个字段,我想写一些方法在他们自动println每个字段和相应的值 目前我有这个: inner class Version(val profile: Profile) { @JvmField val MINOR_VERSION = glGetInteger(GL_MINOR_VERSION) fun write(file: File? = null) { //file.printWriter().use { out -> out.pri } this::class.java.fields.forEach { println(it.isAccessible) println(it.getInt(it)) } } } 但是这是我得到的: false Exception in thread "main" java.lang.IllegalArgumentException: Can not set final int field uno.caps.Caps$Version.MINOR_VERSION to java.lang.reflect.Field at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) at […]

KProperty1.getDelegate上的泛型限制太多?

我试图获得一个类层次结构中的某个类型的所有属性代表。 这给我提出了一些问题。 首先,在Kotlin看来,没有一种简单的方法可以获得班级的超类。 我尝试的第一种方法是使用Java的Class.getSuperclass : private fun <T : Any> KClass<T>.getSuperclass(): KClass<in T>? = (java.superclass as? Class<out Any>)?.kotlin as KClass<in T> 但是这需要一个未经检查的转换,因为Kotlin不允许我将Class<in T>转换回Kotlin,因为显然在T中意味着它可以是非Any的东西,不管可能是什么(“Type参数有一个上在'投影'中'任何'不能被满足'捕获')。 所以我尝试了一个纯粹的Kotlin解决方案:首先获取包括接口( KClass.superclasses )的所有超类,然后过滤出每个接口。 但是KClass上没有什么KClass告诉我它是否是一个接口! 所以我必须再次去Java。 而且它又需要一个未经检查的转换,因为由于某种原因, KClass.superclasses的类型是List<KClass<*>>而不是List<KClass<in T>> : private fun <T : Any> KClass<T>.getSuperclass123(): KClass<in T>? = superclasses.firstOrNull { it.java.isInterface } as KClass<in T>? 我在这里错过了什么? 我必须。 现在对于实际的问题,试图获得一个类层次结构中的所有属性委托实例。 首先我写了一个函数来获取一个类的实例: private fun <T […]

创建一个KClass的新实例

我有一个Kotlin类,其主要(也是唯一的)构造函数是空的。 我有这个类的参考: val kClass: KClass<MyClass> = MyClass::class 如何使用反射来创建这个类的实例? 在Java中我会做myClass.newInstance()但似乎在Kotlin我需要找到第一个构造函数: kClass.constructors.first().call() 我在一些错误报告中看到过提到primaryConstructor ,但是它没有显示在我的IDE中。

在java中实现一个kotlin接口

所以,在这个问题之后 ,我基本上利用反射来传递原始引用来修改原语本身,如: _begin("Another Window", ::showAnotherWindow) 我正在寻找一些东西,使类似的东西也可以从Java,现在我使用平原原始数组: private boolean[] showAnotherWindow = {false}; imgui.begin("Another Window", showAnotherWindow); @hotkey建议我可以创建一个实现KMutableProperty0接口的类,并自动获取并设置相应的变量 例: KMutableProperty0<Boolean> prop = PropUtils.javaProp(this, t -> t.showAnotherWindow, (t, r) -> { t.showAnotherWindow = r; }); _begin("Another Window", prop); 所以,我想尝试一下,并在Java中实现以下内容。 吸气 : @FunctionalInterface public interface Getter<T> { T get(); } 二传手 : @FunctionalInterface public interface Setter<T> { void set(T type); […]

Kotlin反射 – 从CSV创建对象

我有一个名为Member的数据类: data class Member(){ val first_name: String val last_name: String //30 more //a few simple methods } 我正在尝试导入一个CSV文件。 文件的每一行都包含我想用来实例化成员的字段。 fun ReadCsvFileKotlin() { val csvFile = "C:\\Data.csv" var memberList = mutableListOf<Member>() var reader = File(csvFile).readLines() var mbr: Member class Member(val p: Int) val prop = Member::p for(line in reader){ val mbrProperties = line.split(",") for(i in 0..mbrProperties.lastIndex){ […]

Kotlin语言在运行时获得类

假设我们有以下几点: val person = "Bill" 有人可以解释这两者之间的区别: val kClass1 = person.javaClass.kotlin VS val kClass2 = person::class 当我应该叫那个而不是另一个? 任何源代码示例将不胜感激。

Kotlin – 这是一个聪明的方式来抛出一个类的所有方法NotImplementedError?

我需要实现一个有数百个方法的接口( ResultSet )。 现在,我将只实现这些方法的一个子集,为其他方法抛出一个NotImplementedError 。 在Java中我发现了两个解决方案: 创建一个抽象类AbstractResultSet实现ResultSet ,声明所有方法抛出NotImplementedError 。 没有黑客,但有很多样板代码。 使用Proxy.newProxyInstance在InvocationHandler一起实现所有方法。 更少的代码,但也不太适合其他编码人员使用。 Kotlin有第三种选择吗? 在我的情况下,我需要通过IBM数据集(打包十进制,二进制字段,分区号,可变长度的行等)实现一个ResultSet通过SQLServerBulkCopy在SQLServer中导入它。 我不知道哪个ResultSet方法是由这个类调用的,所以现在我只实现“最常用的”方法,将调用记录到未实现的方法中。