【发布时间】: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
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
您可以调用Class.forName(“B”) 和Class.forName(“C”) 来加载它们。
但是 JVM 显式延迟加载类,直到需要它们,因此您无法直接执行此操作。
如果你真的想实现这种行为(并且有从 A 到 B 的类型引用),那么你可以使用反射来列出 A 的所有声明方法和 A 的声明字段。如果其中任何一个包括 B,那么这个列表将导致类被引入。
但是,如果 A 和 B 之间没有关系,那么您必须通过 Class.forName(“B”) 来完成这项工作。
最后还不清楚你为什么要这样做。您能否扩展您的问题以包括“为什么”而不仅仅是“如何”,因为可能有更好的方法。
【讨论】:
如果你想在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;
【讨论】: