Je souhaite stocker les propriétés dans un Map
par leur classe, c'est-à-dire que la mappe ne doit contenir qu'un seul objet de tout type d'exécution. Il y a déjà une implémentation en cours (c'est un projet existant), et le mécanisme est implémenté avec un Map<String, Object>
.Nom de domaine complet d'origine de la classe anonyme
mise en œuvre actuelle:
import com.foo.IConfiguration;
public class ClientCode {
private Options options = new Options();
public void putMethod() {
options.subOptions(new IConfiguration() {
public void configure() {}
});
}
public Object getMethod() {
return options.getSubOption(IConfiguration.class);
}
}
public class Options {
private Map<String, Object> map = new HashMap<>();
public void subOptions(Object subOptionsValue) {
if (subOptionsValue != null) {
map.put(subOptionsValue.getClass().getName(), subOptionsValue);
}
}
public Object getSubOption(Class<?> subOptionsClass) {
return subOptionsClass == null ? null : map.get(subOptionsClass.getName());
}
}
Cependant, cela ne fonctionne pas comme je veux pour les classes anonymes. Dans ce cas, getName()
et les méthodes connexes mettront Options$1
ou quelque chose de similaire, alors que j'en ai besoin pour mettre com.foo.IConfiguration
afin que je puisse l'utiliser de manière fiable dans mon getMethod().
J'ai regardé à travers l'API pour java.lang.Class
, mais je ne trouve rien qui me ramènera à la définition de com.foo.IConfiguration
. Eh bien, je peux, mais ce n'est pas infaillible: clazz.getInterfaces()
donne un tableau d'interfaces, ce qui est bon ici, mais je peux aussi créer un new Object() {}
ou une classe locale, ou une classe publique régulière.
Existe-t-il donc un moyen décent de récupérer sans ambiguïté le nom de domaine complet de l'interface ou de la superclasse d'une classe anonyme?
C'était le début de ma solution qui semble fonctionner. Je posterai le code dans une réponse séparée, mais c'est ce qui m'a fait réfléchir. – blagae