2009-05-21 7 views
19

J'essaie de comprendre le reflecton Java et je rencontre des difficultés lorsque je travaille avec des méthodes de setters non-Integer. Par exemple, comment puis-je résoudre l'appel "getDeclaredMethod()" ci-dessous?Réflexion Java getDeclaredMethod() avec les types de classes

import java.lang.reflect.*; 

class Target { 
    String value; 

    public Target() { this.value = new String("."); } 
    public void setValue(String value) { this.value = value; } 
    public String getValue() { return this.value; } 
} 

class ReflectionTest { 
    public static void main(String args[]) { 
     try { 
      Class myTarget = Class.forName("Target"); 

      Method myMethod; 
      myMethod = myTarget.getDeclaredMethod("getValue"); // Works! 
      System.out.println("Method Name: " + myMethod.toString()); 

      Class params[] = new Class[1]; 
      //params[0] = String.TYPE; // ?? What is the appropriate Class TYPE? 
      myMethod = myTarget.getDeclaredMethod("setValue", params); // ? Help ? 
      System.out.println("Method Name: " + myMethod.toString()); 

     } catch (Exception e) { 
      System.out.println("ERROR"); 
     } 
    } 
} 
+0

Une question que j'ai pour vous, dans quel scénario, je vais essayer de savoir quelles méthodes sont dans la classe et les variables? pourquoi je vais essayer de le savoir? J'explore les raisons de l'utilisation de ces méthodes getDeclaredMethod(), getDeclaredFields(), etc ... Pouvez-vous suggérer – gmhk

+0

Une raison (aléatoire) d'utiliser la réflexion est si vous voulez construire une librairie de sérialisation/désérialisation Json. La célèbre bibliothèque Google Gson utilise beaucoup les réflexions pour réaliser ses tâches. Des exemples de tels usages peuvent continuer indéfiniment. Vous pouvez par exemple créer un protocole réseau que vous pouvez utiliser pour sérialiser et envoyer diverses propriétés d'objets Java à une autre application ou à un serveur basé sur une autre langue, ce qui économise énormément de temps pour ne pas implémenter une méthode sérialiser pour toutes les classes souhaitées échange. –

Répondre

20
params[0] = String.class; 

En utilisant class sur String renverra le Class<?> qui est associé à la classe String.

+4

Pouah. Je suis un idiot. Merci! – Nate

+1

(Oups, je ne voulais pas mettre en doute le commentaire!) Je voulais juste ajouter que je n'étais pas au courant de l'autre jour, donc ce n'est pas si évident. – coobird

+0

Une question que j'ai pour vous, dans quel scénario, je vais essayer de savoir quelles méthodes sont dans la classe et les variables? pourquoi je vais essayer de le savoir? J'explore les raisons d'utiliser ces méthodes getDeclaredMethod(), getDeclaredFields(), etc ... Pouvez-vous suggérer – gmhk

Questions connexes