【问题标题】:How to load java class and its reference class recursively如何递归加载java类及其引用类
【发布时间】:2020-10-11 02:29:14
【问题描述】:

Image 类图是这样的:

class A {
  B b;
}

class B {
  C c;
}

class C {
}

我想在调用A、B或C之前在启动时加载A、B和C类,但是当我尝试class.forName("A")时JVM只加载A类,我怎样才能递归地从A加载所有类到C?

【问题讨论】:

标签: java class reflection jvm


【解决方案1】:

您可以调用Class.forName(“B”)Class.forName(“C”) 来加载它们。

但是 JVM 显式延迟加载类,直到需要它们,因此您无法直接执行此操作。

如果你真的想实现这种行为(并且有从 A 到 B 的类型引用),那么你可以使用反射来列出 A 的所有声明方法和 A 的声明字段。如果其中任何一个包括 B,那么这个列表将导致类被引入。

但是,如果 A 和 B 之间没有关系,那么您必须通过 Class.forName(“B”) 来完成这项工作。

最后还不清楚你为什么要这样做。您能否扩展您的问题以包括“为什么”而不仅仅是“如何”,因为可能有更好的方法。

【讨论】:

    【解决方案2】:

    如果你想在A类中加载B类,在B中加载C类,你需要定义构造函数来新建一个实例

    class A {
     B b;
      public A() { b = new B()}
    }
    
    class B {
      C c;
      public B() {c = new C()}
    }
    
    class C {
    }
    

    然后,当你新建 A 时,它会创建实例类 B、C 并访问它

    A a = new A();
    a.b.c;
    

    【讨论】:

    • 但是我不能在A类中调用B的构造函数,我不能改变A、B和C类的代码。
    • 你不需要调用B的构造函数,因为当你new A时,A的构造函数会调用B的构造函数,B的构造函数会调用C的构造函数,你只需像ab or abc or B b = ab一样调用它跨度>
    • 实际上我想在启动时加载所有这些类,然后再调用 A、B 或 C 类。
    猜你喜欢
    • 2013-12-06
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2011-03-30
    • 2020-01-09
    • 2011-09-10
    相关资源
    最近更新 更多