相关疑难解决方法(0)

使用新的Scala反射API获取协同对象实例

使用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)

reflection scala

27
推荐指数
2
解决办法
1万
查看次数

如何通过反射调用伴生对象的方法?

我有一个类名和一个我知道类型参数的方法,我想通过反射调用这个方法。

在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)

scala

8
推荐指数
1
解决办法
5729
查看次数

如何在Any对象上使用applyDynamic

我正在考虑使用新的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)

scala dynamic

1
推荐指数
1
解决办法
820
查看次数

Scala使用字符串按名称设置函数参数

是否可以通过名称用字符串设置函数的参数.

例如:

给定:

def foo(a: String, b: String)
Run Code Online (Sandbox Code Playgroud)

我可以使用Map来动态调用此函数吗?

Map(("a", "bla"), ("b", "blub"))
Run Code Online (Sandbox Code Playgroud)

如果是这样,怎么样?

谢谢!

scala

1
推荐指数
1
解决办法
900
查看次数

标签 统计

scala ×4

dynamic ×1

reflection ×1