Получение имени подкласса из суперкласса - PullRequest
65 голосов
/ 05 августа 2010

Допустим, у меня есть базовый класс с именем Entity. В этом классе у меня есть статический метод для получения имени класса:

class Entity {
    public static String getClass() {
        return Entity.class.getClass();
    }
}

Теперь у меня есть другой класс, расширяющий это.

class User extends Entity {
}

Я хочу получить имя класса пользователя:

System.out.println(User.getClass());

Моя цель - увидеть вывод «com.packagename.User» на консоль, но вместо этого я собираюсь в итоге получить «com.packagename.Entity», поскольку на класс Entity ссылаются непосредственно из статического метода.

Если бы это не был статический метод, это можно легко решить с помощью ключевого слова this в классе Entity (т. Е. return this.class.getClass()). Однако мне нужно, чтобы этот метод оставался статичным. Любые предложения о том, как подойти к этому?

Ответы [ 12 ]

0 голосов
/ 05 августа 2010

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

class Entity {
    public static String getMyClass() {
        return Entity.class.getName();
    }
}

class Derived extends Entity {
    public static String getMyClass() {
        return Derived.class.getName();
    }
}

Это напечатает пакет. Объект и пакет. Получается по мере необходимости. Грязно, но эй, если это твои ограничения ...

0 голосов
/ 05 августа 2010

Статический метод связан с классом, а не с конкретным объектом.

Рассмотрим, как это будет работать, если бы было несколько подклассов - например, Администратор также является сущностью.Как ваш статический метод Entity, связанный только с классом Entity, узнает, какой подкласс вы хотите?

Вы можете:

  • Использовать существующий метод getClass ().
  • Передайте аргумент в ваш статический метод getClass () и вызовите метод экземпляра для этого объекта.
  • Сделайте ваш метод нестатичным и переименуйте его.
...