Использование текущего класса в объявлении статического метода Java

Моя Ява ржавая, поэтому, пожалуйста, несите меня. В C я могу сделать:

int someFunc(void)
{
 printf("I'm in %s\n", __func__);
}

В Java я могу лексически получить имя или класс типа, который в настоящее время определяется. Например, если у меня есть:

import org.apache.log4j.Logger;
class myClass {
 private static final Logger logger = Logger.getLogger(myClass.class);
...
}

Кажется неправильным повторять "myClass" в аргументе getLogger(). Я хочу "getLogger (__ CLASS__)" или "getLogger (this.class)" или что-то в этом роде. (Я знаю, что оба они глупы, но они должны указывать на то, что я ищу.) Разве компилятор Java действительно не знает, какой класс он посередине, когда он обрабатывает источник?

3 ответа

К сожалению, нет более простого способа, если вы находитесь в контексте static (как вы здесь). Если регистратор был переменной экземпляра, вы можете использовать getClass(), но тогда вам придется беспокоиться о подклассах.

В этом конкретном случае альтернативой является использование log5j. log5j является оберткой вокруг log4j с помощью удобных методов, таких как getLogger(), который выводит правильный класс, идя вверх по стеку. Таким образом, ваш код станет следующим:

import com.spinn3r.log5j.Logger;
class myClass {
 private static final Logger logger = Logger.getLogger();
 ...
}

И вы можете без проблем копировать и вставлять одно и то же объявление во все ваши классы.


Я не мог сопротивляться.

Здесь реализация того, что означает mmyers, но домашняя страница:)

В принципе вы генерируете исключение и получаете второй элемент стека, чтобы получить имя класса.

Я все еще думаю, что лучше иметь его как экземпляр.

:)

package some.utility.packagename; 
import java.util.logging.Logger;
import some.other.packagename.MyClass;
public class LoggerFactory {
 public static Logger getLogger() {
 StackTraceElement [] s = new RuntimeException().getStackTrace();
 return Logger.getLogger( s[1].getClassName() );
 }
 public static void main (String [] args) {
 MyClass a = new MyClass();
 }
}

Использование:

package some.other.packagename;
import java.util.logging.Logger;
import static some.utility.packagename.LoggerFactory.getLogger;
public class MyClass {
 private static final Logger logger = getLogger();
 static{
 System.out.println(MyClass.logger.getName());
 }
}


StackTraceElement[] trace = Thread.currentThread().getStackTrace();
return trace[2].getClassName();

IMHO более аккуратный способ получить трассировку стека

licensed under cc by-sa 3.0 with attribution.