我正在使用一些相当重的反射来检查和遍历类库。我想提取和修改字段 - 静态和实例。静态字段易于查找和修改;我可以收集课程,询问他们的字段列表,记录字段并检查/更改它们的值。
实例字段不同。我可以收集对其 Field 对象的引用,但为了更改它们的值,我需要运行实例化该类型对象的代码。假设我们不知道这段代码做了什么,但是我们有一些方法 blackBox() 实例化一些对象,运行一些代码,使用我们感兴趣的库做一些事情。在它运行之后,我想找到一个实例班级,C.
如果我收集所有静态字段的列表,并通过它们的引用进行足够远的迭代,我最终会在代码中找到所有活动的实例吗?也就是说,我提议:
对于在 Java 程序中实例化的所有未进行垃圾回收的对象,存在一个以静态字段开始并以该对象结束的引用链。
这是关于 Java 程序的一般规则吗?
编辑:两个额外的限定词:
- 我只对不产生线程的顺序程序感兴趣。
- 我假设 blackBox() 已完成处理,并且垃圾收集器已运行。稍后我们可能希望使用库 (moreBlackBox()) 执行更多代码 - 想象一个应用程序已启动,现在已暂停。