Как обновляется объект Date без перекомпиляции программы на Java? - PullRequest
0 голосов
/ 11 ноября 2018

Пример:

System.out.println(new Date());

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

Из моего понимания, благодаря тому, что я прочитал, компилятор Java берет мой исходный код и компилирует его в байт-код, который сохраняется в файле класса. JIT преобразует этот код в машинный код и запускается. Однако разве состояние объекта Date не останется прежним? Это явно не так. Я просто запутался в том, как это меняется.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Время компиляции и время выполнения

Ответ от Mureinik правильный. Объекты, определенные в вашем коде, создаются в время выполнения , а не время компиляции .

Компиляция похоже на то, как инженер проверяет планы архитектора здания, а затем выписывает более подробные спецификации. Ни одно здание еще не построено. Теперь мы полностью готовы к строительству, но на самом деле ничего не строили до «времени выполнения», когда строительная бригада прибыла на площадку.

В этой метафоре ваш исходный код - это чертежи архитектора. Более подробные спецификации инженера - это байт-код , генерируемый компилятором Java. JVM , использующий байт-код вашего приложения, - это строительная бригада, которая будет работать на месте.

Еще один способ подумать, если это:

  • Классы определяются во время компиляции.
  • Объекты (экземпляры) определяются во время выполнения.

java.time

Кроме того, вы никогда не должны использовать класс Date. Этот класс и другие устаревшие классы даты и времени из самых ранних версий Java ужасны , изобилующие плохим выбором дизайна. Они были вытеснены несколько лет назад современными java.time классами.

Классы java.time используют фабричные методы для создания экземпляров, а не конструкторы и new.

Instant.now()  // Capture current moment in UTC. 
OffsetDateTime.now( ZoneOffset.UTC )  // Capture current moment in UTC. 
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )  // Capture current moment as seen though the wall-clock time used by the people of a particular region (a time zone). 
LocalDate.of( 2018 , Month.JANUARY , 23 )  // A date-only value, without time-of-day and without time zone. 
0 голосов
/ 11 ноября 2018
Объект

A Date, инициализированный конструктором no-arg, получит доступ к System.currTimeMilis() и будет использовать текущую временную метку с компьютера. Другими словами, временная метка не «скомпилирована в нее», но вместо этого она содержит код, который обращается к часам машины и получает оттуда временную метку при каждом запуске программы.

...