当前位置: 首页 > 知识库问答 >
问题:

在没有实例的情况下访问Kotlin委托类型

孔经武
2023-03-14
class Example
{
    var nonDelegatedProperty = "I don't care about this property"
    var delegatedProperty1 by lazy { "I don't care about this too" }
    var delegatedProperty2 by CustomDelegate("I care about this one")
}

共有1个答案

南门鸿振
2023-03-14

如果我有Kclass ,但不是Example的实例,我如何获得委托给CustomDelegate的所有属性?

根据你的需要,你可以用两种方法来做。

首先,必须在build.gradle文件中包含Kotlin-Reflection依赖项:

compile "org.jetbrains.kotlin:kotlin-reflect:1.1.51"
// Loop on the properties of this class.
Example::class.declaredMemberProperties.filter { property ->
    // If the type of field is CustomDelegate or the delegate is an instance of CustomDelegate,
    // it will return true.
    CustomDelegate::class.java == property.javaField?.type
}
class Example {
    var nonDelegatedProperty = "I don't care about this property"
    val delegatedProperty1 by lazy { "I don't care about this too" }
    val delegatedProperty2 by CustomDelegate("I care about this one")
    val customDelegate = CustomDelegate("jdo")
}

您将获得DelegatedProperty2CustomDelegate。如果您只想获得delegatedproperty2,我找到了一个可怕的解决方案,如果需要管理这种情况,您可以使用它。

第二

如果检查KPropertyImpl的源代码,就可以看到委派是如何实现的。所以,你可以这样做:

// Loop on the properties of this class.
Example::class.declaredMemberProperties.filter { property ->
    // You must check in all superclasses till you find the right method.
    property::class.allSuperclasses.find {
        val computeField = try {
            // Find the protected method "computeDelegateField".
            it.declaredFunctions.find { it.name == "computeDelegateField" } ?: return@find false
        } catch (t: Throwable) {
            // Catch KotlinReflectionInternalError.
            return@find false
        }

        // Get the delegate or null if the delegate is not present.
        val delegateField = computeField.call(property) as? Field
        // If the delegate was null or the type is different from CustomDelegate, it will return false.
        CustomDelegate::class.java == delegateField?.type
    } != null
}
 类似资料:
  • 我在项目中定义了一个模型类。和往常一样,它有一些私有变量和公共的获取者和设置者 假设在其他类中我使用这个模型,就像 然后person的私有变量保存值“my name”,我使用类的public getter访问变量,如 所以据我所知的人。getMark()返回私有变量名的引用,因此如果我修改局部变量“localMark”,它将影响Person类的私有变量,因此它会破坏变量的私有属性 前任: 我猜大多

  • 问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con

  • 问题内容: 我可以在没有jQuery的情况下访问数据属性吗? 使用jQuery很容易,但是如果没有jQuery,我在任何地方都看不到该怎么做。 如果我在Google上搜索“没有jQuery”,那么我得到的只是jQuery示例。 可能吗 问题答案: 在这里,我找到了这个例子: 因此,它看起来非常可行。

  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口

  • 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口 Base 所有方法,并且委托一个传入的 Base 类的