Как получить имя поля java (слабой) ссылки, указывающей на объект в другом классе? - PullRequest
0 голосов
/ 28 апреля 2010

Представьте, что у меня следующая ситуация:

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 ]

4 голосов
/ 28 апреля 2010

Единственным способом было бы использование отражения. Это верно для полей любого типа, а не только для слабых ссылок.

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

Обратите внимание, что обработка исключений исключена для простоты.

4 голосов
/ 28 апреля 2010

Вы не можете.

То, что вы ищете ("fieldName") - это имя поля, содержащего ссылку на объект WeakReference. Но дело в том, что не имеет значения, что рассматриваемый класс является WeakReference - хотя это действительно запутывает обсуждение. Если вы заменили «WeakReference» во всех случаях на «MyClass», мы могли бы быть в лучшей форме, и ответ все равно остался бы.

Дело в том, что ваша переменная weakRef содержит новую ссылку на тот же объект WeakReference, на который указывает fieldName; нет никакого способа, только на этом основании, узнать имя старой ссылки.

0 голосов
/ 20 мая 2010

Вопрос бессмысленный. Может быть более одного такого поля или ноль.

...