Понимание странного поведения отражения - PullRequest
0 голосов
/ 11 июля 2020

Я писал этот фрагмент кода, чтобы понять отражение, и столкнулся с одним сценарием, в котором я не мог понять причину поведения кода. Надеюсь, я получу рекомендации от сообщества. Ниже приведен мой класс тестовой модели, и здесь для каждого экземпляра я хочу знать точное количество экземпляров, созданных во время выполнения (с использованием отражения)

public final class Model {

    private static final Model instance = new Model("Testing");
    private static int count = 0;

    private String name;

    private Model(String name) {
        this.name = name;
        ++count;
    }

    public static Model getInstance() {
        return instance;
    }

    public static int getInstanceCount() {
        return count;
    }

    public String getName() {
        return name;
    }

    public void doSomething() {
        try {
            System.out.println("Shh.... I am trying to do something");
            Thread.sleep(1000);
            System.out.println("Ok! Done.");
            return;
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        System.out.println("Oops! I failed in doing your job...");
    }
}

Код драйвера для этого сценария выглядит следующим образом:

public class ReflectionTest {

    public static void main(String[] args) throws Exception {

        Model.getInstance().doSomething();
        System.out.println(Model.getInstanceCount());

        Constructor<?>[] constructor = Model.class.getDeclaredConstructors();

        for (Constructor<?> aConstructor : constructor) {
            aConstructor.setAccessible(true);
            Model m = (Model) aConstructor.newInstance("Testing through Reflection");
            System.out.println(m.getName());
            m.doSomething();
             System.out.println(m.getInstanceCount());
            //System.out.println(Model.getInstanceCount());
        }
    }
}

Результат для этого фрагмента кода был следующим:

Shh.... I am trying to do something
Ok! Done.
0
Testing through Reflection
Shh.... I am trying to do something
Ok! Done.
1

Как вы можете видеть, количество экземпляров оказалось равным 1. Я ожидал, что это будет как 2. Однако я изменил конструктор класса тестовой модели, как показано ниже. Тип данных count теперь изменен на Integer вместо ранее установленного int .

    private Model(String name) {
        this.name = name;
        if (count == null)
            count = 0;
        ++count;
    }

Удивительно, но я получаю правильное значение для количества экземпляров.

Shh.... I am trying to do something
Ok! Done.
1
Testing through Reflection
Shh.... I am trying to do something
Ok! Done.
2

Это может быть глупый вопрос, но я не могу понять, что на самом деле произошло за кулисами. Мне нужны рекомендации сообщества по этому поводу. Заранее спасибо.

1 Ответ

2 голосов
/ 11 июля 2020

Это не имеет ничего общего с отражением.

private static final Model instance = new Model("Testing");
private static int count = 0;

Инициализаторы выполняются по порядку. Итак:

private static final Model instance = new Model("Testing");

Выполнение конструктора приводит к увеличению count с 0 до 1, но затем:

private static int count = 0;

Возвращает счетчик к нулю.

Поменяйте порядок объявлений в обратном порядке.

private static int count = 0;
private static final Model instance = new Model("Testing");

Или опустите инициализатор на count (его значение по умолчанию в любом случае равно нулю).

private static final Model instance = new Model("Testing");
private static int count;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...