2011-01-25 1 views
4

Я знаю, что это довольно незначительно, но в начале каждого класса я в конечном итоге копирую и вставляю, а затем меняю следующую строку кода.В Java есть статическая версия 'this'

private static final String TAG = MyClass.class.getName(); 

Что бы я хотел сделать, это не изменять каждый бит MyClass при каждом копировании.

i.e. Я хотел бы написать это.

private static final String TAG = this.class.getName(); 

но ясно, что в этом пункте нет. Я знаю его второстепенный, но я вообще что-то узнал из ответов SO, и действительно узнал, что некоторые хорошие вещи просто ищут, есть ли ответ.

+2

Java огорчает Нет 41 – skaffman

+0

Он также подвержен ошибкам, если вы сделаете опечатку для MyClass.class с действительным именем класса. Случилось со мной не раз ;-) – PeterMmm

+0

Или если вы небрежны в отношении «повторного использования» cut-n-paste. –

ответ

7

Вы можете определить шаблон для Eclipse, называемый tag, например:

private static final String TAG = ${enclosing_type}.class.getName(); 

Затем введите tag с последующим Ctrl+Space и вставит это утверждение.

Я использую этот метод для объявления регистраторов в моих классах.

Кроме того, запрос трассировки стека текущего потока:

private static final String TAG = Thread.currentThread().getStackTrace()[1].getClassName(); 
+0

Отлично, спасибо. – aronp

+0

+1 умный ..... –

+0

getStackTrace() [1] или getStackTrace() [0] как упоминалось позже? – aronp

1

this означает, например, конкретные материалы. Для продуктов уровня класса используйте имя класса или просто вызывайте их явно, если вы вызываете из класса.

2

К сожалению, этого избежать невозможно. Вы должны явно указать токен класса для каждого класса. Отражение могло бы дать некоторый общий способ справиться с этим, но было бы гораздо более уродливо, что об этом не стоит думать :-)

+0

Черт возьми, что я думал. – aronp

+2

Невозможно с отражением. Вы должны начать с «класса» где-то, и пусть это будет первой проблемой. – BalusC

1

Вы не знаете, как я хотел чего-то подобного (this.class), но, к сожалению, нет.

3

уродливое рубить, но это даст вам имя текущего класса:

частных статических строк тег = новый RuntimeException(). getStackTrace() [0] .getClassName();

+1

Yup, немного слишком уродливый для верхней части каждого файла, но спасибо. – aronp

1

Пользователь dogbane предложил запросить трассировку стека текущего Thread. Можно съехать этот код в класс с именем ClassInfo:

package util; 

public class ClassInfo { 
    private ClassInfo() {} 
     static public String className() { 
      return Thread.currentThread().getStackTrace()[2].getClassName(); 
    } 
} 

Затем из статического контекста, мы можем получить имя класса, ссылаясь на ClassInfo.className() или просто className() если мы будем использовать статический импорт.

Пример:

import static util.ClassInfo.className; 

public class MyClass { 

    public static void main(String[] args) { 
     System.out.println(className()); 
     Inner.print(); 
    } 

    private static class Inner { 
     static void print() { 
      System.out.println(className()); 
     } 
    } 
} 

Выход:

 
MyClass 
MyClass$Inner 
Смежные вопросы