相关疑难解决方法(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万
查看次数

Scala反射错误:这是一个内部模块,在InstanceMirror上使用reflectModule来获取其ModuleMirror

关注这个问题,我试图弄清楚如何在一个对象上调用一个方法.相关定义是:

trait ThirdParty { def invoke = println("right") }
trait WeatherIcon { def invoke = println("wrong") }
class MyClass {
    object objA extends ThirdParty
    object objB extends WeatherIcon
}
Run Code Online (Sandbox Code Playgroud)

我有一个SymbolobjA这样的:

import reflect.runtime.universe._

val stuff = typeOf[MyClass].members.filter(_.isValue).filter(_.typeSignature <:< typeOf[ThirdParty])
Run Code Online (Sandbox Code Playgroud)

返回一个Iterable元素,所以让我们说:

val objASymbol = stuff.head.asModuleSymbol
Run Code Online (Sandbox Code Playgroud)

然后我根据这个问题尝试了这个:

val mirror = runtimeMirror(getClass.getClassLoader)
mirror.reflectModule(objASymbol)
Run Code Online (Sandbox Code Playgroud)

这导致了主题上引用的错误消息:

java.lang.Error: this is an inner module, use reflectModule on an InstanceMirror to obtain its ModuleMirror
    at scala.reflect.runtime.JavaMirrors$JavaMirror.reflectModule(JavaMirrors.scala:118)
    at scala.reflect.runtime.JavaMirrors$JavaMirror.reflectModule(JavaMirrors.scala:60)
Run Code Online (Sandbox Code Playgroud)

问题是我无法弄清楚这条错误信息告诉我要做什么!

macros scala scala-2.10

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

如何在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 中扩展特征的所有类

所以我正在构建一个库,我遇到的问题如下:

我有一个特点,比如

package my.library
trait Animal {
  def randomFunctions
}
Run Code Online (Sandbox Code Playgroud)

我需要知道的是消费者代码具有的所有类,它们扩展/实现了所述特征,例如

package code.consumer
case class Cat extends Animal
case class Dog extends Animal
Run Code Online (Sandbox Code Playgroud)

所以总而言之:在我的库(具有该特征)中,我需要找出扩展/实现该特征的所有类(在消费者代码中)。

reflection inheritance scala

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

标签 统计

scala ×4

reflection ×2

dynamic ×1

inheritance ×1

macros ×1

scala-2.10 ×1