java - 垃圾收集和反射

标签 java reflection memory-leaks garbage-collection

我想知道当您有一个使用反射来获取某些字段值的类时,垃圾回收是如何工作的。当不使用正式语言语法访问它们时,JVM 如何知道这些字段引用的值是可访问的,因此目前不符合垃圾回收条件?

指出问题的一小段(尽管此处过分强调了反射(reflection)):

/**
 *
 */

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

干杯,
克里斯

最佳答案

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

关于java - 垃圾收集和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6443972/

相关文章:

java - 如何按类型动态创建通用的 lambda 实现?

c++ - 构造函数通过抛出异常结束?是否存在内存泄漏?

c++ - 可以跳过动态分配的静态成员变量的删除吗?

c++ - 分析字符串替换内存泄漏

c# - 如何在运行时从 NUnit 测试运行中获取单元测试方法属性?

Java非法启动类型?

java - 带有模式 yyyyMMddhhmmss 的 SimpleDateFormat 无法解析日期 "20160327020727"

java - 创建 jar 文件时注意依赖关系

c# - 我可以使用反射来获取已被 new 关键字覆盖的基本属性吗?

java - 如何通过 SOAP 进行 Windows Live 身份验证 (RST)