Scala:Metaobject的特征

1 scala metaprogramming

在Scala中,有像java.lang.Class和的metaobjects java.lang.reflect.Method.但是特征存在什么元对象?

class Foo {
  def foo = "foo"
}

var obj = classOf[Foo]

obj // java.lang.Class[Foo] = interface Foo
Run Code Online (Sandbox Code Playgroud)

它打印界面.这是什么?

axe*_*l22 6

上面的输出让我感到惊讶 - 它应该打印一个类.除非你想宣布trait Foo.您使用的Scala版本是什么?

每晚给出以下输出:

Welcome to Scala version 2.9.0.r23117-b20100929093241 (Java HotSpot(TM) Server VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class Foo {
     | def foo = "foo"
     | }
defined class Foo

scala> var obj = classOf[Foo]
obj: java.lang.Class[Foo] = class Foo
Run Code Online (Sandbox Code Playgroud)

在Scala JVM实现中,Scala类通常被转换为JVM字节码类.如果一个特征只包含这里的方法声明:

trait Foo {
  def foo: String
}
Run Code Online (Sandbox Code Playgroud)

Java接口Foo由编译器生成.

如果它也有定义,就像这里:

trait Foo {
  def foo = "foo"
}
Run Code Online (Sandbox Code Playgroud)

编译器将生成一个接口Foo和一个所谓的实现类,其名称Foo$class包含实际的方法体.程序员看不到此实现类.它用于引擎盖下的mixin-composition.

在这两种情况下,如果使用classOf构造来获取特征的Class对象,您将获得特征的接口的标准Java类对象Foo,您可以使用它来检查方法,Foo就像执行它一样.对于课程.

  • Foo $ class实际上可以通过一些技巧来实现,例如:classOf [Foo] .getClassLoader.getClass("Foo $ class").但总的来说答案是现实的. (2认同)