想象一下我有以下情况:
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”?
提前致谢。
答案 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)
这个问题毫无意义。可能有多个这样的字段,或者为零。