Единственным способом было бы использование отражения. Это верно для полей любого типа, а не только для слабых ссылок.
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());
}
}
}
}
}
Обратите внимание, что обработка исключений исключена для простоты.