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

如何从Kotlin中的对象实例访问同伴对象?

叶鸿振
2023-03-14

带有同伴对象的简单示例类

class MyClass {
  companion object {
     val test = 25
  }
}

值测试可以通过MyClass.test访问,但如何从MyClass的实例访问?如果我有val sample=MyClass(),那么我如何从sample访问测试?sample::class.test不正确....有没有办法?

public class MyClass {
    static Integer test = 25;
    public Integer testGetter(){ return test; }    
}

Java,C++,python等都有很简单的解决方案...(我将为每个有帮助的is提供代码示例),我认为kotlin会有一个比使用Java更好的解决方案

对于在没有对象实例(如工厂)的情况下访问类属性,kotlin companion object提供了静态的替代(并且具有优势),但是对于虽然对象实例可用,但静态是合适的,因为单个属性可以由类的所有成员共享,并且属性不依赖于实例的情况,静态也有另一种使用。

共有1个答案

郤飞英
2023-03-14

使用反射,您可以通过CompanionObject:

sample::class.companionObject?.memberProperties?.find { it.name == "test" }
 类似资料:
  • 我试图在其他类中调用一个类的静态函数,但在kotlin中我不能创建一个静态函数,我必须创建一个伴生对象,在其中我必须定义我的函数,但在这样做的时候我不能访问父类变量,有什么方法可以在kotlin中实现这一点。 我想访问有趣的returnString()类的静态函数,就像我们在java中做的一样,如果有谁已经实现了这一点,请帮助。

  • 所以我有下面的代码,用Kotlin写的。 我在最后一条指令行()上得到一个编译错误,编译器说,但我不知道为什么。 我认为同伴对象应该对它们“陪伴”的类的属性具有某种可见性。 (免责声明:此代码正在从Java迁移到Kotlin。在Java版本上,以前是同一个类上的静态方法。) 多谢!

  • 我想知道是否可以在同伴对象中使用类的属性。例如,以贝娄为例: 我不能通过c1或C2调用changeAge()函数。我可以使用changeAge的唯一地方是通过Person1.changeAge(),当Person1还没有用适当的构造函数实例化时。我想知道这些动作是不是有其他的选择,或者是没有,有同伴对象有什么意义呢

  • 我用Kotlin编写了这些方法并分析了字节码: null 上下文。我一直在Kotlin编码,我觉得它很神奇。但有时我需要做一个决定:例如,一个很重的不可变属性,在java中我会将其声明为static final,但在Kotlin中我发现很难“找到一个等价物”。

  • 在Kotlin的类中,一个对象和一个同伴对象有什么区别? 它的“静态”(我是java方面的)生命周期可能有区别吗?