我看到 "Re-entry is not allowed" 是什么意思?

What does it mean when I see "Re-entry is not allowed"?

我正在尝试做这样的事情。

class A extends B {
    Injector injector = Guice.CreateInjector(this);
    // ......statements...
}

正在抛出IllegalStateException: 不允许重入

com.google.inject.internal.util.$Preconditions.checkState(Preconditions.java:142)
    at com.google.inject.AbstractModule.configure(AbstractModule.java:55)
    at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
    at com.google.inject.spi.Elements.getElements(Elements.java:101)
    at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:72)
    at com.google.inject.Guice.createInjector(Guice.java:62)

为什么会这样?

发生这种情况的唯一方法是,如果您在 configure 方法 内的 同一模块实例上调用 Guice.createInjector()。如果像示例中那样在对象构造时调用它,不会 发生。这是将重现该堆栈跟踪的代码。

class B extends AbstractModule {
    protected void configure() {
    }
}

public class A extends B {
  Injector injector;

  @Override
  protected void configure() {
    injector = Guice.createInjector(this);
  }
}

public class GuiceTest {
  public static void main(String... args) {
    A a = new A();
    Injector inj = Guice.createInjector(a);
  }
}

我对如何修复它的回答是...不要这样做!从来没有任何理由这样做。

在您知道自己在做什么之前,您永远不应在应用程序中多次调用 Guice.createInjector(),而那一次通常在您的 Main class 或许多你的 static void main 方法本身的情况。我对所有事情都使用 Guice,而且我 仍然从未在同一个应用程序中多次调用它 。这个想法是你构建你的模块,将它们传递给你的注入器,然后让 Guice 为你注入其他所有东西。参见:Getting Started

是什么促使您尝试这样做的?注意:请不要通过编辑问题或评论来回答我,因为这两件事会 invalidate this answer. Instead, ask a new question that explains what you're really trying to do, and avoid the XY problem.