使用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) 关注这个问题,我试图弄清楚如何在一个对象上调用一个方法.相关定义是:
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)
我有一个Symbol为objA这样的:
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)
问题是我无法弄清楚这条错误信息告诉我要做什么!
我正在考虑使用新的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) 所以我正在构建一个库,我遇到的问题如下:
我有一个特点,比如
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)
所以总而言之:在我的库(具有该特征)中,我需要找出扩展/实现该特征的所有类(在消费者代码中)。