【问题标题】:scala: analogy to metaclasses in python?scala:类似于python中的元类?
【发布时间】:2011-08-15 23:44:00
【问题描述】:

在 scala 中,我需要实现类似于 python 元类的东西。在我的例子中,使用元类的目标通常是创建一个特定基类的所有子类的注册表——也就是说,从类的字符串表示到类的引用的映射。在 python 中,在基类上放置一个元类非常方便,这样就不需要对每个子类做任何特别的事情。我正在寻找在scala中做类似的事情。有什么方法可以模拟元类,或者以不同的方式进行吗?谢谢!

【问题讨论】:

  • 不清楚你最终想要什么,但在 scala 中没有相当于 python 的元类。如果你想从一个字符串中获取一个类,你应该使用 Class.forName。

标签: scala metaprogramming metaclass


【解决方案1】:

如果您知道类的完全限定名,则可以使用java.lang.Class 中的常用Java 反射方法加载它,即Class.forName(String fqClassName)。鉴于Class 的结果实例,只有如果有一个零参数构造函数,实例化很容易,否则你会陷入所有 Java 反射类型的混乱世界。

如果您想要一种“发现”,其中类在编译时未知并且其名称未以某种方式作为程序的输入或参数提供,那么类加载器方法可能是唯一的答案。

【讨论】:

    【解决方案2】:

    没有什么类似于 python 的元类。您所说的注册表可能可以使用自定义类加载器或反射。

    【讨论】:

    • 谢谢 - 你能想到任何其他通用方法从类类型获取字符串表示,然后能够从该字符串实例化该类的新对象吗?
    • @Heinrich 查看 Randall 的回答。一旦你有了java.lang.Class,你就可以打电话给newInstance。但是,如果您想查找某个类的所有子类,请询问有关它的 Java 问题。
    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2014-04-28
    • 1970-01-01
    • 2011-04-30
    • 2011-04-16
    相关资源
    最近更新 更多