我知道通常不会这样做,并且我在网络上发现了许多有关此问题的实例,答案如下:“如果您需要这样做,您的设计就是错误的。” 让我解释一下我的目标。
我有一个 Web 应用程序,它在一个站点上以某种方式导致一个 servlet 的 init() 方法被重复调用。我不知道这是怎么发生的,我不能重复。但是,从二进制堆转储(由内存不足异常引起)中,从堆上的对象可以清楚地看出,特定 servlet 的 init() 方法被调用了大约 10,000 次,因为这是这些对象的唯一位置被创建并且有 10,000+ 个对象的实例应该不超过一个实例。
因为我无法重现在这个站点上发生的事情,所以我想在这个 servlet 上多次强制调用 init(),最好是通过 JSP 文件,这样我就可以在应用修复之前和之后进行测试。测试“之后”的情况在理论上很容易,因为我可以将代码更改为(例如)将这个 servlet 粘贴到上下文中,这样我就可以得到它并重复调用 init() 来证明这个对象没有泄漏。但这并不能帮助我用现有代码测试“之前”的情况。
我不能只在 JSP 中使用“(new MyServlet()).init()”。这会失败,因为 servlet 是使用空上下文创建的并且无法初始化。在 Tomcat 5.5 中,似乎 ServletContext.getServlets() 总是返回一个空枚举,而 ServletContext.getServlet(String) 总是返回 null。
似乎最简单的测试方法是我是否可以以某种方式以编程方式(最好是从 JSP)访问相关的 servlet 实例,或者以编程方式将新映射添加到可能创建新实例的同一个 servlet 类。(?)