scala中当前静态范围的类

时间:2011-02-24 13:01:20

标签: scala

我正在构建这样的记录器(使用configgy):

class MyClass {
  private val log = Logger.get(classOf[MyClass])
}

我想避免在classOf[MyClass]中重复“MyClass”(例如我想快速复制粘贴日志定义行,而不使用智能IDE扩展带有类名的模板),但我不这样做想要使用当前对象的动态类,如:

class MyClass {
  private val log = Logger.get(this.getClass)
}

编辑:因为这种方式的子类实例将子类类对象传递给父记录器:

class MyClass {
  private val log = Logger.get(this.getClass)
  def doit = log.info("doing")
}
class SubClass extends MyClass {
}

new SubClass().doit

将使用为SubClass配置的记录器,而不是我想要的MyClass。

有没有办法让某些固定的表达式以某种方式产生在该点定义的类?

2 个答案:

答案 0 :(得分:1)

当然,你可以使用受保护的访问修饰符并直接访问它吗?

class MyClass {
  protected val log = Logger.get(classOf[MyClass])
}

class SubClass extends MyClass {
}

new SubClass().doit

答案 1 :(得分:1)

简短的回答是Scala无法做到这一点。答案很长,你可以做到,但这是一个丑陋的黑客。该hack将使用异常堆栈跟踪包含创建堆栈跟踪的静态类定义的名称这一事实。解析和田田。但是,说真的,不要这样做。或者,如果这样做,将其移动到mixin特征并修改解析位以从跟踪中的适当位置提取类名。此外,我只是在一些相当有限的条件下对此进行了测试:无法保证它在任何地方都能正常工作。

class MyClass {
  private val log = Logger get (Class forName (
    new RuntimeException().getStackTrace.apply(0).toString takeWhile 
        (_ != '(') split "\\." dropRight 1 mkString "."))
  def doit = log.info("doing")
}