Scala newInstance()嵌套在trait中的内部类

Scala newInstance()嵌套在trait中的内部类,scala,reflection,Scala,Reflection,我正在编写一个脚本,以便在新集群上部署应用程序时,为某些特定MongoDB集合自动配置分片。应用程序正在使用Lift框架,基本上每个分片集合都映射到一个MongoRecord类,该类扩展了特定的“分片集合”特性。我需要对这些类调用一个特定的方法,以获取它们的集合名称 因此,第一步是在代码中找到我使用的那些特定类。然后我需要一种方法来实例化它们,为此我认为java反射应该能够做到这一点。这是有效的,但前提是这些类不属于外部类 此特定边缘情况下的配置如下所示: class X { class Y

我正在编写一个脚本,以便在新集群上部署应用程序时,为某些特定MongoDB集合自动配置分片。应用程序正在使用Lift框架,基本上每个分片集合都映射到一个MongoRecord类,该类扩展了特定的“分片集合”特性。我需要对这些类调用一个特定的方法,以获取它们的集合名称

因此,第一步是在代码中找到我使用的那些特定类。然后我需要一种方法来实例化它们,为此我认为java反射应该能够做到这一点。这是有效的,但前提是这些类不属于外部类

此特定边缘情况下的配置如下所示:

class X {
  class Y extends ShardedCollection {

  }
}
因此,在阅读了一些文档之后,我发现我必须调用
YConstructor.newInstance(XObject)
,当Y是X的内部类时,newInstance将XObject(作为X的实例)作为第一个参数。我的策略是递归实例化封闭类,直到得到具有shardeCollection特性的类

当X不再是一个类而是一个特性,并且没有可以用于它的构造函数,但我仍然需要向newInstance提供一个XObject时,问题就出现了。。棘手:(


言简意赅

如果构造函数的声明类是非静态上下文中的内部类,那么构造函数的第一个参数必须是封闭实例


当封闭的“东西”是一个特征时,我该怎么办?(假设我不能修改代码库中的任何东西)

最初的目标是什么?我编辑了这个问题,希望你能发现它更清楚。我非常怀疑反射是实现这一目标的更好方法。使用泛型和类型应该是可能的,并且不容易出错。我同意应该避免反射,但在这里,如果不更改代码库中的任何内容,我找不到任何其他方法当然。如果出现最坏的情况,您可以使用scala编译器API(!),假设trait没有抽象成员(!!),生成一个表示trait的伪子类的AST(!!!),在运行时编译该AST(!!!!),反射性地构造生成的
(!!!!),然后使用它(∞). 我不会给出细节,因为我并不真正了解它们,而且不管怎么说,这太肮脏了,肯定有更好的方法。也许可以用细节来打开另一个问题,看看你是否能就反思的必要性获得第二个意见。