使用Scala的新反射API,是否可以获得对类的伴随对象的引用?我正在考虑以下几点:
trait Base {
def companion: MetaBase = someReflectionMagic(this).asInstanceOf[MetaBase]
}
trait MetaBase {
// stuff
}
// ---
class Foo extends Base
object Foo extends MetaBase
assert(new Foo.companion == Foo)
Run Code Online (Sandbox Code Playgroud) 我有一个类名和一个我知道类型参数的方法,我想通过反射调用这个方法。
在java中我会做类似的事情:
Class.forName("foo").getMethod("name", ... type args...).invoke(null, ..args)
Run Code Online (Sandbox Code Playgroud)
但是在 Scala 中,每当我尝试调用时,都会收到一个空引用错误。
我正在使用 Scala 2.10.4
- 编辑
我试过了:
$ scala
Welcome to Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class Foo { def bar(x: Int) = x }
defined class Foo
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> val foo = new Foo
foo: Foo = Foo@2db7a79b
scala> runtimeMirror(getClass.getClassLoader).reflect(foo)
res0: reflect.runtime.universe.InstanceMirror = instance mirror for Foo@2db7a79b
scala> …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用新的Type Dynamic,但发现一个明显的用例没有得到很好的实现.我正在尝试为面向对象的数据库创建便利包装器.它遭受了转换和可用性问题,因为它序列化和反序列化对象(它的方法返回Object).
第一个问题:我的数据库的get方法反序列化A类型的对象.Althought A有一个方法a(),我可能知道在给定的时刻,我有一个A,我不能调用a(),因为java只看到对象.如果"底层"对象实际上具有该方法,那么动态机制会为我设置,还是我必须自己在applyDynamic中处理它?我在REPL中尝试过,似乎对我没那么做.如果我必须自己检查,最简单的方法是什么(使用scala的新反射),检查该对象是否具有方法"methodname",如果是,则调用它.
害怕这个/sf/answers/773948731/ 我回到java的反射,它非常容易地执行方法调用部分.
我想出来了:
scala> import java.lang.reflect.Method
import java.lang.reflect.Method
scala> class DynTest3 extends Dynamic {
| def pee():String = "yuppie"
| def execSucced(method: Method, args: Any*):Boolean = return try{method.invoke(args); true} catch { case e: Exception => false }
| def applyDynamic(methodName : String)(args: Any*){
| val succed = classOf[DynTest3].getDeclaredMethods.filter(m => m.getName() == methodName).exists(m => execSucced(m))
| if (!succed)
| throw new java.lang.NoSuchMethodException
| }
| }
defined class DynTest3
Run Code Online (Sandbox Code Playgroud)
但:
scala> val y: Object = new …Run Code Online (Sandbox Code Playgroud) 是否可以通过名称用字符串设置函数的参数.
例如:
给定:
def foo(a: String, b: String)
Run Code Online (Sandbox Code Playgroud)
我可以使用Map来动态调用此函数吗?
Map(("a", "bla"), ("b", "blub"))
Run Code Online (Sandbox Code Playgroud)
?
如果是这样,怎么样?
谢谢!