Java 垃圾收集和反射

Java 垃圾收集和反射,java,reflection,memory-leaks,garbage-collection,Java,Reflection,Memory Leaks,Garbage Collection,我想知道当您有一个带有反射的类用于获取一些字段值时,垃圾收集是如何工作的。JVM如何意识到这些字段引用的值是可访问的,因此在目前没有使用正式语言语法访问它们的情况下不符合垃圾收集的条件 一个小片段指出了这个问题(尽管这里过度强调了反思): 干杯, Chris如果您正在访问实例的字段,那么仍然需要对该实例的引用。在这种情况下,GC不会有任何异常。要访问对象的字段,必须有对该对象的引用。如果您通过反射或直接访问它,对于您是否具有对对象的强引用没有任何区别。这是一个有点奇怪的测试用例:您使用反射来访问

我想知道当您有一个带有反射的类用于获取一些字段值时,垃圾收集是如何工作的。JVM如何意识到这些字段引用的值是可访问的,因此在目前没有使用正式语言语法访问它们的情况下不符合垃圾收集的条件

一个小片段指出了这个问题(尽管这里过度强调了反思):

干杯,

Chris

如果您正在访问实例的字段,那么仍然需要对该实例的引用。在这种情况下,GC不会有任何异常。

要访问对象的字段,必须有对该对象的引用。如果您通过反射或直接访问它,对于您是否具有对对象的强引用没有任何区别。

这是一个有点奇怪的测试用例:您使用反射来访问“this”。根据定义,“this”在声明类的实例方法中使用时是活动的,所以不会被GCed


但更重要的是,反射只允许您操作字段等。。在已经有引用的对象中。这是关键-如果您可以给出反映要检查的实例,那么您显然仍然有对该对象的引用,因此它保持活动状态。

有趣的问题。它是受某种嵌入式Java应用程序启发的吗?能否请您提供一个代码片段,以澄清您所说的“具有反射的类用于获取某些字段值”的含义?实际上,我正在为一个网络框架进行测试,一些字段是通过反射访问的。想知道反射是如何影响内存使用的,也许JVM保留了不确定的对象。反射总是增加额外的开销。例如,如果使用反射执行方法调用,则必须首先获取对方法对象的引用,等等。这意味着您正在构造对象并执行几个其他调用(通常是一些条件逻辑),以便只执行一个方法调用。一般来说,当这种方法的灵活性大于性能缺点时,您会喜欢它。同意。不过,我正在做一些复杂的事情,涉及到通过代理的状态和尊重。几乎就像一个更简单的注入版本。
/**
 *
 */

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);
        }
    }
}