【发布时间】:2011-06-22 17:24:45
【问题描述】:
我想知道当你有一个用于获取某些字段值的反射类时,垃圾收集是如何工作的。当不使用正式语言语法来访问它们时,JVM 如何知道这些字段引用的值是可访问的,因此目前不适合进行垃圾收集?
一个小的 sn-p 指示问题(尽管此处过分强调反射):
/**
*
*/
import java.lang.reflect.Field;
public class B {
protected B previous = null, next = null;
/**
*
*/
public B(B from) {
this.previous = from;
}
public void transition(B to) {
this.next = to;
}
public B next() {
try {
Field f = getClass().getField("next");
f.setAccessible(true);
try {
return (B)f.get(this);
} finally {
f.setAccessible(false);
}
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
public B previous() {
try {
Field f = getClass().getField("previous");
f.setAccessible(true);
try {
return (B)f.get(this);
} finally {
f.setAccessible(false);
}
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
}
干杯,
克里斯
【问题讨论】:
-
有趣的问题。它是否受到某种嵌入式 Java 应用程序的启发?
-
能否请您包含一个代码 sn-p 以阐明“用于获取某些字段值的具有反射的类”的含义?
-
其实我正在做一个网络框架的测试,有些字段是通过反射访问的。想知道反射是如何影响内存使用的,也许是 JVM 保留了它不确定的对象。
-
反射总是增加额外的开销。例如,如果您正在使用反射执行方法调用,则必须首先获取对 Method 对象的引用等。这意味着您正在构造对象并执行其他几个调用(通常是一些条件逻辑)只是为了执行一种方法调用。一般来说,当这种方法的灵活性超过性能劣势时,您会更喜欢这种方法。
-
同意。不过,我正在做一些复杂的事情,涉及通过代理的状态和尊重。几乎就像一个更简单的注入版本。
标签: java reflection memory-leaks garbage-collection