Получение имени класса из статического метода в Java - PullRequest
224 голосов
/ 02 июня 2009

Как можно получить имя класса из статического метода в этом классе. Например

public class MyClass {
    public static String getClassName() {
        String name = ????; // what goes here so the string "MyClass" is returned
        return name;
    }
}

Чтобы поместить это в контекст, я действительно хочу вернуть имя класса как часть сообщения в исключении.

Ответы [ 15 ]

4 голосов
/ 12 февраля 2014

Решение для рефакторинга, резки и вставки, которое позволяет избежать определения специальных классов ниже.

Напишите статический метод, который восстанавливает имя класса, стараясь включить имя класса в имя метода:

private static String getMyClassName(){
  return MyClass.class.getName();
}

затем вызовите его статическим методом:

public static void myMethod(){
  Tracer.debug(getMyClassName(), "message");
}

Рефакторинг безопасности обеспечивается за счет отказа от использования строк, безопасность копирования и вставки предоставляется, потому что если вы вырезаете и вставляете метод вызывающей стороны, вы не найдете getMyClassName () в целевом классе «MyClass2», поэтому вам придется переопределять и обновите его.

3 голосов
/ 20 апреля 2015

Поскольку вопрос Что-то вроде `this.class` вместо` ClassName.class`? помечено как дубликат для этого (что является спорным, потому что этот вопрос касается класса, а не имени класса ), Выкладываю ответ здесь:

class MyService {
    private static Class thisClass = MyService.class;
    // or:
    //private static Class thisClass = new Object() { }.getClass().getEnclosingClass();
    ...
    static void startService(Context context) {
        Intent i = new Intent(context, thisClass);
        context.startService(i);
    }
}

Важно определить thisClass как private , потому что:
1) он не должен быть унаследован: производные классы должны либо определять свои собственные thisClass, либо выдавать сообщение об ошибке
2) ссылки из других классов должны быть сделаны как ClassName.class, а не ClassName.thisClass.

Если определено thisClass, доступ к имени класса становится следующим:

thisClass.getName()
1 голос
/ 26 марта 2015

Мне нужно было имя класса в статических методах нескольких классов, поэтому я реализовал JavaUtil Class следующим методом:

public static String getClassName() {
    String className = Thread.currentThread().getStackTrace()[2].getClassName();
    int lastIndex = className.lastIndexOf('.');
    return className.substring(lastIndex + 1);
}

Надеюсь, это поможет!

0 голосов
/ 22 декабря 2017

Я использовал эти два подхода для сценариев static и non static:

Основной класс:

//For non static approach
public AndroidLogger(Object classObject) {
    mClassName = classObject.getClass().getSimpleName();
}

//For static approach
public AndroidLogger(String className) {
    mClassName = className;
}

Как указать имя класса:

нестатический способ:

private AndroidLogger mLogger = new AndroidLogger(this);

Статический способ:

private static AndroidLogger mLogger = new AndroidLogger(Myclass.class.getSimpleName());
0 голосов
/ 11 июня 2015

Если вы используете отражение, вы можете получить объект Method, а затем:

method.getDeclaringClass().getName()

Чтобы получить сам метод, вы, вероятно, можете использовать:

Class<?> c = Class.forName("class name");
Method  method = c.getDeclaredMethod ("method name", parameterTypes)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...