在 Java 中,您可以编写:
Class<SomeClass> foo = SomeClass.class;
我正在玩 Scala 并想要更多:我想在编译时获得一个方法(及其泛型类型),如下所示:
val foo : Method[...] = SomeClass.class.someMethod
甚至:
val foo : Method[...] = someObject.class.someMethod
有没有办法在 Scala 中做这样的事情?
在 Java 中,您可以编写:
Class<SomeClass> foo = SomeClass.class;
我正在玩 Scala 并想要更多:我想在编译时获得一个方法(及其泛型类型),如下所示:
val foo : Method[...] = SomeClass.class.someMethod
甚至:
val foo : Method[...] = someObject.class.someMethod
有没有办法在 Scala 中做这样的事情?
也许,与需要实例的 Java 库互操作的唯一例外,Method
在 Scala 中永远不需要这样做。
如果您需要传递一个方法以供以后调用;然后部分应用它来创建一个FunctionN
实例,通过一个别名参数传递它,或者在第一种情况下直接将它创建为一等函数。
如果您需要反思方法以便可以规避私有可见性,也许是为了测试,那么您真的应该重构您的设计以避免首先出现这种可见性限制。
如果您只是在探索 Scala,并了解概念与 java 的比较。或者,如果您不幸陷入互操作的不良情况,那么等效于SomeClass.class
is的构造classOf[SomeClass]
。希望你永远不需要它:)
对于一个类:
val classOfClass = classOf[SomeClass]
对于一个对象(使用 getClass 的区别很重要,否则伴生对象的类将无法访问):
val classOfObject = SomeClass.getClass
假设代码如下:
class SomeClass {
def someMethod() {}
}
object SomeClass
在此之后,您可以使用 Java 反射操作,例如Class#getMethod(String,Class<?>...)
(假设someMethod没有参数):
val method = classOfClass.getMethod("someMethod")