2009-05-21 13 views
19

Sto cercando di capire il reflecton di Java e sto incontrando difficoltà quando lavoro con metodi setter non interi.Java Reflection getDeclaredMethod() con tipi di classe

Come esempio, come posso risolvere la chiamata "getDeclaredMethod()" di seguito?

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

Una domanda che ho per voi, in quale scenario, cercherò di sapere quali metodi sono presenti nella classe e nelle variabili? perché cercherò di saperlo? Sto esplorando le ragioni per l'utilizzo di questo metodo getDeclaredMethod(), getDeclaredFields(), ecc. Puoi suggerire – gmhk

+0

Un motivo (casuale) per l'uso di reflection è se vuoi creare una libreria di serializzazione/deserializzazione Json. La nota libreria di Google Gson utilizza pesantemente le riflessioni per raggiungere i suoi compiti. Esempi di tali usi possono continuare all'infinito. Ad esempio, puoi creare un protocollo di rete che puoi utilizzare per serializzare e inviare varie proprietà di oggetti Java a un'altra applicazione oa un server basato su un'altra lingua, risparmiando un'enorme quantità di tempo per non dover implementare un metodo serialize per tutte le classi che desideri scambio. –

risposta

20
params[0] = String.class; 

Utilizzando class su String restituirà la Class<?> che è associato con la classe String.

+4

Ugh. Sono un idiota. Grazie! – Nate

+1

(Ops, non volevo fare un commento a sorpresa!) Volevo solo aggiungere che non ne ero a conoscenza l'altro giorno, quindi non è esattamente così ovvio. – coobird

+0

Una domanda che ho per te, in quale scenario, cercherò di sapere quali metodi sono presenti nella classe e nelle variabili? perché cercherò di saperlo? Sto esplorando le ragioni per l'utilizzo di questo metodo getDeclaredMethod(), getDeclaredFields(), ecc ... Puoi suggerire per favore – gmhk

Problemi correlati