【问题标题】:How to get the field name of a java (weak) reference pointing to an object in an other class?如何获取指向其他类中对象的java(弱)引用的字段名称?
【发布时间】:2010-04-28 09:55:02
【问题描述】:

假设我有以下情况:

Test1.java

import java.lang.ref.WeakReference;
public class Test1
{
    public WeakReference fieldName;

    public init()
    {
        fieldName = new WeakReference(this);
        Test2.setWeakRef(fieldName);
    }
}

Test2.java

import java.lang.ref.WeakReference;
public class Test2
{    
    public static setWeakRef(WeakReference weakRef)
    {
        //at this point I got weakRef in an other class.. now, how do I get the field name this reference was created with? So that it returns exactly "fieldName", because that's the name I gave it in Test1.java?
    }
}

在评论的位置,我收到了在其他类中创建的弱引用。我将如何检索创建此弱引用的字段名称,在本例中为“fieldName”?

提前致谢。

【问题讨论】:

    标签: java reflection reference field


    【解决方案1】:

    唯一的方法是使用反射。这适用于任何类型的字段,不仅适用于弱引用。

    Field[] fields = Test1.getDeclaredFields();
    
    for (Field field : fields) {
      if (field.getType().equals(WeakReference.class) {
        System.out.println(field.getName());
      }
    }
    

    当然,此示例仅在 Test1 中有一个 WeakReference 字段时才有效。

    更新:如果您有多个引用字段,您需要访问对象本身,以便获取特定字段的实际值并将其与接收到的值进行比较。就像在这个修改过的代码示例中一样:

    public class Test2 {    
      public static setWeakRef(Test1 instance, WeakReference weakRef) {
        Field[] fields = Test1.getDeclaredFields();
    
        for (Field field : fields) {
          if (field.getType().equals(WeakReference.class) {
            WeakReference value = (WeakReference) field.get(instance);
            if (value == weakRef) {
              System.out.println(field.getName());
            }
          }
        }
      }
    }
    

    请注意,为简单起见,省略了异常处理。

    【讨论】:

    • "当然,这个例子只有在 Test1 中有一个 WeakReference 字段时才有效" 这就是问题所在。我不能测试该字段的引用是否等于弱引用或其他什么?
    【解决方案2】:

    你不能。

    您要查找的(“fieldName”)是包含对 WeakReference 对象的引用的字段的名称。但事实是,所讨论的类是 WeakReference 并不重要——尽管这确实使讨论非常混乱。如果您在所有情况下都将“WeakReference”替换为“MyClass”,我们的状态可能会更好,而且答案仍然成立。

    事实上,您的 weakRef 变量包含对 fieldName 指向的同一 WeakReference 对象的新引用;仅在此基础上,没有办法找出旧参考的名称。

    【讨论】:

    • 我很困惑。为什么 weakRef 会包含一个新的引用?我认为方法传递引用而不是创建新引用?
    • 我的意思是fieldName 是一个包含对对象的引用的变量,而weakRef 是一个不相关的变量,包含对同一对象的引用。
    • 我仍然对引用感到困惑。我认为参考将保持不变。无论如何,接受你的答案。谢谢。
    【解决方案3】:

    这个问题毫无意义。这样的字段可能不止一个,也可能为零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多