在编译时获取Class <t>?</t>

时间:2011-09-08 19:22:40

标签: scala reflection compile-time

在Java中你可以写:

Class<SomeClass> foo = SomeClass.class;

我正在玩Scala并想要更多:我希望在编译时获得一个Method(及其泛型类型),如下所示:

val foo : Method[...] = SomeClass.class.someMethod

甚至:

val foo : Method[...] = someObject.class.someMethod

有没有办法在Scala中做这样的事情?

2 个答案:

答案 0 :(得分:6)

或许,对于需要Method实例的Java库的互操作的唯一例外,在Scala中永远不需要执行此操作。

如果需要传递一个方法以便以后调用;然后部分应用它来创建FunctionN实例,通过副名称参数传递它,或者在第一种情况下直接创建它作为第一类函数。

如果你需要反思方法以便绕过私人可见性,也许是为了测试,那么你真的应该重构你的设计,以避免首先考虑可见性限制。

如果您正在探索Scala,并了解概念与java的比较。或者,如果你不幸遇到一个错误的互操作案例,那么SomeClass.class的等价结构就是classOf[SomeClass]。希望你永远不需要它:)

答案 1 :(得分:2)

上课:

val classOfClass = classOf[SomeClass]

对于一个对象(使用getClass的区别很重要,否则伴随对象的类将无法访问):

val classOfObject = SomeClass.getClass

假设代码如下:

class SomeClass {
  def someMethod() {}
}

object SomeClass

在此之后,您可以使用Class#getMethod(String,Class<?>...)之类的Java反射操作(假设 someMethod 没有参数):

val method = classOfClass.getMethod("someMethod")