Как получить тип поля по отражению во время выполнения? - PullRequest
0 голосов
/ 03 февраля 2020

Как получить тип класса (А1 или А2) базы в тестовом методе по отражению во время выполнения? Я пытался this.getClass().getField("base").getType();, но getType возвращает объявленный тип, есть ли способ сделать это?

Заранее спасибо!

public class Base{

}

public class A1 extends Base{

}

public class A2 extends Base{

}

public abstract class Cmd{
    public Base base;
    public void test(){
        this.getClass().getField("base").getType();
    }

}

public class Cmd1 extends Cmd{
    public Cmd1(Base base){
        this.base = base;

    }
}


public class Cmd2 extends Cmd{
    public Cmd2(Base base){
        this.base = base;
    }
}

Base testBase = new A1();
Cmd myCmd = new Cmd1(testBase);

1 Ответ

1 голос
/ 03 февраля 2020

То, что вы хотите, совершенно невозможно.

this.getClass() будет относиться либо к объекту, представляющему ваш класс Cmd1, либо к вашему классу Cmd2. Однако в любом случае фактическое поле, на которое ссылается имя base, является полем public Base base;. И тип этого ПОЛЯ равен Base, потому что ... ну, это прямо здесь. Это не волшебным образом меняется только потому, что этот класс подкласс. Reflection представляет класс в том виде, в каком вы его напечатали, а не какой-то конкретный экземпляр.

Как только вы говорите о конкретном c экземпляре Cmd1 или Cmd2, которым вы являетесь, поскольку существует this ссылка, вы можете просто разыменовать свое поле и проверить, что там на самом деле: this.base.getClass(). Конечно, если this.base равно нулю, это не сработает, и в этом суть: базовое поле МОЖЕТ ссылаться на любой экземпляр, тип которого равен Base или любой его подтип, но в настоящее время он не ссылается ни на что, поэтому пути нет чтобы ответить на вопрос «каков конкретный c тип того, на что вы ссылаетесь».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...