2010-04-28 7 views
0

Imaginez que j'ai la situation suivante:Comment obtenir le nom de champ d'une référence Java (faible) pointant vers un objet dans une autre classe?

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

A l'emplacement du commentaire que j'ai reçu la référence faible créée en une autre classe. Comment devrais-je récupérer le nom de champ avec lequel cette référence faible a été créée, dans ce cas "fieldName"?

Merci d'avance.

Répondre

4

La seule façon serait d'utiliser la réflexion. Ceci est vrai pour les champs de tout type, pas seulement pour les références faibles.

Field[] fields = Test1.getDeclaredFields(); 

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

Bien sûr, cet exemple ne fonctionne que si vous avez un seul champ WeakReference dans Test1. Si vous avez plusieurs champs de référence, vous devez accéder à l'objet lui-même, afin d'obtenir et de comparer la valeur réelle d'un champ spécifique avec la valeur reçue. Comme dans cet exemple de code modifié:

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

Notez que la gestion des exceptions est laissée pour des raisons de simplicité.

+0

"Bien sûr, cet exemple ne fonctionne que si vous avez un seul champ WeakReference dans Test1" C'est le problème. Je ne peux pas tester si la référence du champ est égale à la référence faible, ou quelque chose? – Tom

+0

@Tom, voir ma mise à jour. –

+0

Merci beaucoup! – Tom

4

Vous ne pouvez pas. Ce que vous cherchez ("fieldName") est le nom d'un champ contenant une référence à un objet WeakReference.

Mais le fait est que ce n'est pas grave que la classe en question soit WeakReference - bien que cela puisse embrouiller la discussion terriblement. Si vous avez remplacé "WeakReference" dans tous les cas par "MyClass", nous pourrions être en meilleure forme, et la réponse serait toujours valable.

Le fait est que votre variable weakRef contient une nouvelle référence au même objet WeakReference que fieldName pointe vers; il n'y a aucun moyen, juste sur cette base, de trouver le nom de l'ancienne référence.

+0

Je suis confus. Pourquoi weakRef contiendrait une nouvelle référence? Je pensais que les méthodes passaient des références plutôt que d'en créer de nouvelles? – Tom

+0

Ce que je veux dire, c'est que 'fieldName' est une variable contenant une référence à un objet et' weakRef' est une variable sans rapport contenant une référence au même objet. – Etaoin

+0

Je suis toujours confus au sujet des références. Je pensais que la référence resterait la même. Quoi qu'il en soit, accepté votre réponse. Merci. – Tom

0

La question n'a pas de sens. Il pourrait y avoir plus d'un tel champ, ou zéro.