如何获取指向其他类中的对象的java(弱)引用的字段名称?

时间:2010-04-28 09:55:03

标签: java reflection reference field

想象一下我有以下情况:

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”?

提前致谢。

3 个答案:

答案 0 :(得分:4)

你不能。

您要查找的内容(“fieldName”)是包含对WeakReference对象的引用的字段的名称。但事实是,所讨论的课程是WeakReference并不重要 - 虽然这确实使讨论混乱不堪。如果你在所有情况下用“MyClass”替换“WeakReference”,我们可能会处于更好的状态,答案仍然有效。

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

答案 1 :(得分:4)

唯一的方法是使用反射。对于任何类型的字段都是如此,不仅仅是弱引用。

Field[] fields = Test1.getDeclaredFields();

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

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

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

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

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

答案 2 :(得分:0)

这个问题毫无意义。可能有多个这样的字段,或者为零。