Java: Может ли родительский класс статически получить имя класса ребенка?

StackOverflow https://stackoverflow.com/questions/4705607

Вопрос

Что касается Java, я хотел бы статически Знайте имя класса текущего класса. A - родительский класс B. Я хотел бы иметь статическую строку в (родительском классе), который содержит имя класса текущего класса, но когда на эту статическую строку ссылается в B (детский класс), он должен содержать Название класса Беременный. Анкет Это возможно?

Пример:

public class Parent {

protected static String MY_CLASS_NAME = ???
.
.
.
}

public class Child extends Parent {

public void testMethod() {
     if (MY_CLASS_NAME.equals(getClass().getName())) {
        System.out.println("We're equal!");
     }
}

}
Это было полезно?

Решение

Единственный способ, которым я знаю, - это следующее: создать защищенный конструктор, который принимает строку в родительском классе.

class Parent {
    private final String className;
    protected Parent(String className) {
         this.className = className;
    }
}

public class Child extends Parent {
    public Child() {
        super("Child");
    }
}

Кстати, вы даже можете улучшить это, используя new Throwable().getStackTrace() в Paren's Custructor. В этом случае вам даже не нужно обеспечивать соблюдение всех детей, чтобы передать свое имя родителю.

class Parent {
    private final String className;
    protected Parent() {
         StackTraceElement[] trace = new Throwable().getStackTrace();
         this.className = trace[1].getClassName();
    }
}

Другие советы

Нет, это невозможно. Есть только одна копия статической строки (для загрузчика класса), но вы можете иметь несколько подклассов.

Однако вы можете иметь статическое поле для (суб) класса, а затем использовать метод

public class Child extends Parent {
   private static final String NAME = "some alias";

   @Override
   public String getName() {
       return NAME;
   }
}

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

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

  class Parent{
    final String className;
    public Parent(){
     className=this.getClass().getName();
    }
  }

и сделайте это для необходимых подклассов

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top