加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala特征中的this.getClass用法

发布时间:2020-12-16 10:02:42 所属栏目:安全 来源:网络整理
导读:有人可以解释为什么这个代码以这种方式工作?我想制作自己的概念证据Loggable trait.计划是实例化一个记录器实例,以便继承的类不必执行该工作.但正如我所知,这不是我想要的. 这是代码: package hu.jonas.simpletrait Loggable { val logger = java.util.log
有人可以解释为什么这个代码以这种方式工作?我想制作自己的概念证据Loggable trait.计划是实例化一个记录器实例,以便继承的类不必执行该工作.但正如我所知,这不是我想要的.

这是代码:

package hu.jonas.simple

trait Loggable {
  val logger = java.util.logging.Logger.getLogger(this.getClass.getName)

  def whoAmI = {
    logger.info(this.getClass.getName)
  }
}

class Service extends Loggable {
  def answer = {
    whoAmI
  }
}

object Main extends App {
  new Service().answer
}

它产生了以下日志消息:

Jan 25,2013 2:02:07 PM hu.jonas.simple.Loggable$class whoAmI
INFO: hu.jonas.simple.Service

为什么两个this.getClass.getName不同?而且,当我实例化记录器以获得这个时,我需要写什么:

Jan 25,2013 2:02:07 PM hu.jonas.simple.Service whoAmI
INFO: hu.jonas.simple.Service

解决方法

在您的代码中,两个getClass.getName的出现都返回相同的值.但是,在格式化输出消息时,记录器只是使用源类(通过检查堆栈可以知道)而不是记录器的名称(在您的情况下对应于getClass.getName).因此,输出日志记录头的记录器实际上是使用完成日志调用的类的名称,而日志消息的内容是实例的名称运行时类.所以这就像静态与运行时类型问题.如果您想知道Loggable $class来自何处,那么恰好名为T的特征中的方法实现位于名为T $class的JVM类中.

现在进行说明.在下面的代码中,我更改了日志处理程序,以便从源类中删除信息.这会强制记录器使用记录器名称而不是源类名称,并返回您期望的行为.

import java.util.logging._
trait Loggable {
  val logger = Logger.getLogger(this.getClass.getName)

  logger.getParent.getHandlers.foreach{ handler => 
    val formatter = handler.getFormatter
    handler.setFormatter( new java.util.logging.Formatter {
      def format( record: LogRecord ) = {
        record.setSourceClassName( null )
        formatter.format( record )
      }
    })
  }


  def whoAmI = {
    logger.info(this.getClass.getName)
  }
}

class Service extends Loggable {
  def answer = {
    whoAmI
  }
}

object Main extends App {
  new Service().answer
}

现在,为了正确解决您的问题,有一个名为java.util.logging.SimpleFormatter.format的属性,您可以设置该属性来更改默认日志格式.使用它来使日志使用记录器名称而不是源类.见http://docs.oracle.com/javase/7/docs/api/index.html?java/util/logging/SimpleFormatter.html.请注意,它需要Java 7.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读