powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Scala:шаблончик main с логгером
4 сообщений из 4, страница 1 из 1
Scala:шаблончик main с логгером
    #38472207
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Пока заказчик не видит пытаюсь тихонько подпилить
парочку процессов на другой язык. Для старта нужен шаблончик
с логгером.

Код: java
1.
2.
3.
4.
5.
>scala -version
Scala code runner version 2.10.2 -- Copyright 2002-2013, LAMP/EPFL

>javac -version
javac 1.7.0_13



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import org.apache.log4j.{BasicConfigurator, Logger}

object TestWs {

  val logger = Logger.getLogger(classOf[TestWs.type ])

  def main(args: Array[String]) {

    BasicConfigurator.configure();

    logger.info("Begin");

    logger.info("End");

  }

}


Компилируем
Код: java
1.
2.
3.
scala: class type required but TestWs.type found
  val logger = Logger.getLogger(classOf[TestWs.type ])
                                              ^



Если так.
Код: java
1.
val logger = Logger.getLogger(TestWs)


Компилируем
Код: java
1.
2.
3.
4.
5.
6.
scala: overloaded method value getLogger with alternatives:
  (x$1: Class[_])org.apache.log4j.Logger <and>
  (x$1: String)org.apache.log4j.Logger
 cannot be applied to (TestWs.type)
  val logger = Logger.getLogger(TestWs)
                      ^



Да штоб тебя.. Чорт.
...
Рейтинг: 0 / 0
Scala:шаблончик main с логгером
    #38472429
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Используйте this.getClass() или аналог. То же самое на StackOverflow здесь
...
Рейтинг: 0 / 0
Scala:шаблончик main с логгером
    #38472811
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Работает.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
import org.apache.log4j.{BasicConfigurator, Logger}

object TestWs {

  val logger = Logger.getLogger(this.getClass)

  def main(args: Array[String]) {

    BasicConfigurator.configure();

    logger.info("Begin");

    logger.info("End");

  }

}



Забавно но похоже 'object' Scala трактует как вложенный или анонимный класс. Видно из имени логгера.
Код: java
1.
2.
0 [main] INFO TestWs$  - Begin
1 [main] INFO TestWs$  - End
...
Рейтинг: 0 / 0
Scala:шаблончик main с логгером
    #38473822
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗабавно но похоже 'object' Scala трактует как вложенный или анонимный класс. Видно из имени логгера.

Как синтетический будет более точно (хотя атрибут synthetic я в байткоде не нашел). В атрибутах "InnerClass" в байткоде класс не значится. И java/jvm конвенция предписывает использовать порядковые номера для анонимных классов.

"object" в Scala 2.10 (на других, наверное, аналогично, но у меня сейчас только она) генерирует сразу две вещи:

Во-первых, это класс для объекта с именем "<ObjectName>$". Это полноценный класс с "виртуальными" методами да еще и с аксессором в стиле "глобальный синглтон". Насколько я понимаю, это нужно для случаев, когда объект наследуется от не-object или использует какой-нибудь trait.

Во-вторых, в классе "<ObjectName>" генерируется набор статических методов, которые все банальны и вызывают методы на экземпляре объекта (имена урезал, слишком широко было):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$javap -v Model
...
  public static ru....Statement label(java.lang.Object, ru....Statement);
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=2, args_size=2
Класс реализации "object" не может совпадать с именем объекта потому, что может быть объявлен еще и "class ObjectName". 
         0: getstatic     #16  // Field .../Model$.MODULE$:L.../Model$;
         3: aload_0       
         4: aload_1       
         5: invokevirtual #62 // Method .../Model$.label:(L.../Object;L.../Statement;)L.../Statement;
         8: areturn       
...


Класс реализации "object" не может совпадать с именем объекта потому, что может быть объявлен еще и "class ObjectName". В этом случае статические методы добавятся к "class ObjectName", дополнительно к уже объявленным там виртуальным методам.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Scala:шаблончик main с логгером
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]