2010-10-21 4 views
2

J'essaie de résoudre le problème suivant en réflexion. J'ai un POJO qui agit comme une méta-donnée pour la signature de la méthode dans la classe TestResponse. TestResponse a un setDate() methid qui prend un paramètre Date. J'essaye de faire ceci est un code générique qui peut accepter n'importe quelle méthode et sa signature pour placer dans la réponse. Ce que je n'arrive pas à comprendre, c'est comment définir le paramètre Classe en appelant getMethod() en fonction de l'entrée. L'entrée me dit de définir le paramètre comme Date, mais je ne sais pas comment y parvenir.java réflexion question

Voici mon exemple de code. Bien sûr, le mdi.modifier.getClass() est faux car il aura String.class au lieu de Date.class.

TestResponse response = new TestResponse(); 
Object val = "test"; 
MDIBase mdi = new MDIBase("setDate", "Date"); 
Method m = response.getClass().getMethod(mdi.method, mdi.modifier.getClass()); 
m.invoke(response, new Object[] { val }); 

Voilà MDIBase

public class MDIBase { 
public String method; 
public String modifier; 
public MDIBase(String method, String modifier){ 
this.method = method; 
this.modifier = modifier; 
} 

Les pointeurs seront très appréciés.

Merci

Répondre

3

Je ne suis pas sûr que je comprends très bien, mais si je le fais, vous voulez être en mesure de passer un nom de classe pour le paramètre?

Pour ce faire, au lieu de passer dans « Date » passer « java.util.Date » (ce qui est connu comme le nom complet de la classe), puis au lieu de getClass appel

response.getClass().getMethod(mdi.method, Class.forName(mdi.modifier)); 

Cela va charger dynamiquement la classe qui a le nom qualifié complet que vous avez fourni.

Est-ce ce que vous cherchez? Si ce n'est pas le cas, donnez-moi plus d'informations et je ferai un autre coup de poignard.

+1

Exactement ce que j'écrivais! Mais aussi, pourquoi utiliser une chaîne pour mdi.modifier? Pourquoi ne pas en faire un objet de classe? Alors votre ligne 'MDIBase mdi = nouvelle MDIBase (" setDate "," Date ");' serait 'MDIBase mdi = nouvelle MDIBase (" setDate ", java.util.Date.class);' –

+0

@Stephen, cela pourrait totalement travail. J'essayais juste d'être aussi proche de ce que le code original de @ Shamik était :-). Je pense que la chaîne pourrait permettre plus de flexibilité dans l'instance où vous vouliez que l'utilisateur puisse spécifier le nom de la classe (comme à partir de la ligne de commande ou de xml, etc.) ... mais cela fonctionnerait tout de même ... –

+0

Parfait, c'est exactement ce que je cherchais .. merci Chris, appréciez votre aide. – Shamik