【问题标题】:In Java, how can I run a static method whenever my class gets loaded or unloaded?在 Java 中,当我的类被加载或卸载时,如何运行静态方法?
【发布时间】:2023-03-05 13:05:01
【问题描述】:

我有一个类使用静态方法来包装远程 API 调用。

一般来说,我不希望我的 API 服务器一直“监听”这些调用,而是只在程序使用类时监听。所以我需要一种方法来告诉服务器在加载类时“唤醒”(我如何发送“唤醒”消息无关紧要)。

我知道我可以在调用第一个类方法时唤醒服务器,但我希望在将类加载到正在运行的程序中时它准备好(即使它是延迟加载的)。

另外,如果该类不再使用,我会很高兴知道,这样我就可以告诉服务器重新进入睡眠状态。

基本上,我正在寻找整个类的“构造函数”和“终结器”。这个可以吗?

编辑:我忘了提到一件非常重要的事情,我不能让用户使用公共静态方法或类似的方法手动初始化/完成类。该课程需要感觉像一个普通的本地课程。

【问题讨论】:

  • 您需要满足“有意义的使用”才能将类“加载”到 JVM 中。那时,静态初始化程序可能就是您想要的。我不知道终结器部分。
  • 不确定我理解您所说的“有意义的使用”是什么意思。您的意思是 JVM 仅在第一次使用类时才延迟加载类?我忘了提到我不想在类中添加静态初始化/完成方法,从用户的角度来看,整个事情需要像普通类一样。
  • 差不多,是的。查看一些文献:onjava.com/pub/a/onjava/2005/01/26/classloading.html
  • 这台服务器是否在某种容器中?你能绑定到 web-app 生命周期或 servlet 上下文生命周期吗?类加载生命周期是......不是一个非常好的定义的东西。
  • 恐怕班级寿命是我唯一可以利用的东西。此类旨在用于本地环境并“感觉”像本地类。正因为如此,我选择不添加静态“初始化”方法。

标签: java static jvm classloader


【解决方案1】:

您可以使用静态初始化块

class YourClass {
    static {
        System.out.println("I got loaded!");
    }
}

这将在类被 JVM 加载时调用。

对于卸载部分,一种方法(不一定是最好的)是在静态初始化程序中启动一个计时器,在该计时器中,您可以在一段时间没有使用后关闭资源。用法将通过调用构造函数或类似的东西来指示,但实现并发问题可能会很棘手。

另一种方法是编写自定义类加载器。

【讨论】:

  • 非常感谢!一个非常简单的解决方案。还要感谢在你之前写过类似东西的另一个人,但在我有机会回复之前就删除了它......他可能认为我不想以这种方式初始化课程,因为我不够清楚我不想做的事。无论如何,我编辑了我的原始帖子以澄清。再次感谢你们。
  • 对了,或许有办法在主程序退出时调用“析构函数”?
  • 此代码以我原评论中有意义的使用部分为准。如果他没有首先引用静态字段、方法或创建类的实例(从技术上讲,这段代码将在字段/方法的值或类的构造之前运行,但它发生在此之前),他不应期望此代码运行。这似乎与 OP 的编辑相反,您在其中声明他们不能通过引用静态字段或其他方式导致代码运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多