Предположим, что у меня есть базовый класс с функцией foo
public class Base
{
protected static void foo()
{
// ToDo - what is the name of the child class calling me?
}
}
и по меньшей мере один дочерний класс, содержащий статический инициализатор, который вызывает foo
public class Child extends Base
{
static
{
foo();
}
}
Есть ли способ foo()
узнать, какой дочерний класс назвал его? Я предполагаю там технику отражения, которую я могу использовать.
Вы можете получить класс с помощью getClass
, например:
o.getClass()
также, если у вас есть класс c, и вам нужно проверить, является ли o экземпляром c, вы можете использовать instanceof
, например:
o instanceof c
Приветствия.
Самый простой способ - передать аргумент. Например
public class Base {
protected static void foo(Class<?> type) {
if (type == Child.class) {
}
}
}
public class Child extends Base {
static {
foo(Child.class);
}
}
Однако, если вам нужно сделать что-то, что зависит от дочернего класса, я рекомендую искать решение, которое использует абстрактные методы и полиморфизм.
public Base {
protected static void foo(Base child) {
child.doFoo();
}
protected abstract void doFoo();
}
public Child extends Base {
static {
foo(new Child());
}
@Override
protected void doFoo() {
//do the child specific thing here
}
}