为了账号安全,请及时绑定邮箱和手机立即绑定

在不重新编译 Java 程序的情况下,如何更新 Date 对象?

在不重新编译 Java 程序的情况下,如何更新 Date 对象?

慕盖茨4494581 2022-01-12 14:31:55
例子:System.out.println(new Date());现在显然这是一个更大程序的一部分,但你可以看到它做了什么。现在,我运行编译器一次,然后运行程序。然后,无需再次编译程序,我运行它并更新日期。这可能看起来很愚蠢,但是在不更新字节码的情况下如何更新日期呢?根据我对阅读内容的理解,Java 编译器获取我的源代码并将其编译为字节码,该字节码保存在类文件中。JIT 将此代码转换为机器代码并运行。但是,Date 对象的状态不会保持不变吗?显然不是。我只是对它如何变化感到困惑。
查看完整描述

2 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

编译时与运行时

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. 


查看完整回答
反对 回复 2022-01-12
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

Date使用无参数构造函数初始化的对象将访问System.currTimeMilis()并使用机器中的当前时间戳。换句话说,时间戳不是“编译到其中”,而是包含访问机器时钟并在每次程序运行时从那里获取时间戳的代码。


查看完整回答
反对 回复 2022-01-12
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信