Java: Может ли родительский класс статически получить имя класса ребенка?
-
11-10-2019 - |
Вопрос
Что касается 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();
}
}
и сделайте это для необходимых подклассов