Metodi getMethod e invoke di relfections

di il
2 risposte

Metodi getMethod e invoke di relfections

Ho creato due classi Dati e Dati2, che hanno stessi campi e stessi metodi

public class Dati {

	private int valore = 0;

	public int getValore() {
		return valore;
	}

	public void setValore(int valore) {
		this.valore = valore;
	}	
}

public class Dati2 {

	private int valore = 0;

	public int getValore() {
		return valore;
	}

	public void setValore(int valore) {
		this.valore = valore;
	}	
}

e un test che copia i valori di una classe nell'altra attraverso i metodi getMethod e invoke della reflections
public class TestProperty {

	public static void main(String[] args) {
		
		Dati d = new Dati();
		Dati2 d2 = new Dati2();
		
		Method metodo = null;
		Integer value = null;
	
		d.setValore(7);
        	
        
        	metodo = d.getClass().getMethod("get" + "Valore", new Class[]{});
				
			if(metodo != null){
				value = metodo.invoke(d, new Object[]{});
			}
			
        	metodo = d2.getClass().getMethod("set" + "Valore", new Class[]{value.getClass()});
			
			if(metodo != null){
				metodo.invoke(d2, new Object[]{value});
			}
	
ma mi da il seguente errore
NoSuchMethodException.

certo per fare cio avrei potuto fare in tanti altri modi, ma
non riesco a capire perché il programma mi vede il metodo get, ma non il metodo set, delle classi Dati e Dati2.
me lo vede solamente se io metto int.class al posto di value.getClass().
qualcuno sa dirmi qualcosa per favore

2 Risposte

  • Re: Metodi getMethod e invoke di relfections

    Scusate ho risolto,
    per fare cio occorre usare la classe Integer e non la classe wrapper int,
    scusate, ho smanettato un attimo e ho risolto
    ciao
  • Re: Metodi getMethod e invoke di relfections

    Quando si usa il getMethod di Class, i Class dei parametri devono corrispondere esattamente ai tipi dei parametri del metodo. Se un parametro è int, si dovrà passare int.class, se è Integer si dovrà passare Integer.class. NON ci sono regole di widening/(un)boxing automatico a questo livello della reflection! Come invece c'è a livello di linguaggio Java.

    Quando poi si invoca il metodo con invoke si passa sempre un array di OGGETTI, quindi al invoke non può arrivare un int ma solo un Integer. Ci pensa la API della reflection a convertire il valore in primitivo se il tipo era effettivamente int.class .
Devi accedere o registrarti per scrivere nel forum
2 risposte