Newsgroup: it.comp.java
Titolo: AIUTO !!! (classe "Class", metodo "getMethod(String[] name, Class[] parameterTypes)")

Dovrei aggirare un "piccolo" problema. La situazione è la seguente:
In una classe (diciamo "Tabella") c'è il metodo setCodice(int i) che
richiede un int come parametro; da una classe esterna (diciamo
"GestoreTabelle") voglio chiamare il metodo setCodice passando un intero
dato.
Ho a disposizione un'istanza di Tabella e la stringa "setCodice"
corrispondente al nome del metodo che vorrei chiamare. Ora, il metodo
getMethod della classe Class richiede come parametri il nome del metodo (OK)
e un array delle classi corispondenti ai parametri da passare al metodo: che
classe devo passare per indicare che il parametro deve essere di tipo int?
Infatti, se provo con
    int i = 0;
    parametro = i.getClass();
la compilazione mi dà:
    int cannot be dereferenced
Grazie.
PS: Dimenticavo: non chiamo direttamente setCodice(intero) perchè il metodo
setCodice potrebbe richiedere (in altre tabelle) un parametro di tipo
String, Date, o altro.

classe devo passare per indicare che il parametro deve essere di tipo int?
non vorrei dire una castroneria, ma credo che l'unica soluzione sia
cambiare la definizione del metodo in modo che accetti un Integer
(eventualmente per non comportare modifiche all'interno del metodo
stesso lo converti in int come prima cosa nel metodo)
HTH,
Kali

L'errore ti viene dato perché stai lavorando con i tipi di dato primitivi.
Infatti int non appartiene a nessuna classe.
Comunque il linguaggio Java mette a disposizione delle classi come Boolean,
Integer,...  che puoi utilizzare a tale scopo.
Quindi prova con:
Integer oggetto = new Integer(0);
parametro = oggetto.getClass();
Cmq in Java non è previsto il passagio di qualsiasi argomento ad una
funzione. Java, a differenza del C, è molto pignolo per quanto riguarda i
tipi e dopo tutto, non è un male.
Quindi se tu hai un:
void setCodice(int i) {
}
puoi solo passare al metodo valori interi o comunque convertibili in int.
Se hai bisogno di più metodi setCodice potresti ricorrere all'overloading,
ovvero:
void setCodice(int i) {
}
void setCodice(float i) {
}
void setCodice(double i) {
}
a questo punto tocca al compilatore capire quale metodo si sta chiamando,
l'importante e che i parametri dei metodi siano diversi.
Nel caso che tu decidessi di implementare gli oggetti hai due strade
possibili: o dichiari più metodi contenenti diversi parametri come:
void setCodice(Integer a) {
}
void setCodice(Boolean a) {
}
oppure hai un modo per aggirare l'ostacolo:
void seCodice( Object a) {
}
la variabile Object può prendere qualsiasi tipo di oggetto in quanto le
regole del java dicono che una variabile di tipo superclassse può contenere
senza bisogno di cast esplicito un oggetto della sottoclasse.
Ps: Tieni però presente che gli oggetti sono molto più "pesanti" dei tipi
primitivi e personalmente consiglio di evitarli il più possibile.


|
| Bruno Bossola
| A Java Software Engineer :-)
|

Scusa, ma cos'è TYPE? Scritta così mi sembra che sia  una costante di
classe.

String, Date, o altro.
Se il tuo scopo è di avere un metodo general purpose  ci sono altri
metodi per farlo: non è mai consigliabile mischiare tipi primitiv con
classi.
Ad ogni modo, come recita Sun nella documantazione della classe Class
(API doc)
---------
Instances of the class Class represent classes and interfaces in a
running Java application. Every array also belongs to a class that is
reflected as a Class object that is shared by all arrays with the same
element type and number of dimensions. The primitive Java types
(boolean, byte, char, short, int, long, float, and double), and the
keyword void are also represented as Class objects. 
--------
Il problema per te sta solo nel capire come arrivare alla classe degli
interi, ed è semplice (eppure mi sembra di ricordare che il tutorial
Sun lo spieghi bene, :-/   ti consiglio di guardarlo, perché
sicuramente tratta bene l'argomento, meglio di come potrebbe fare
chiunque di noi con risposte rapide e sommarie come questa ).
import java.lang.reflect.*;
public class Test {
  public void myMethod(int a, char c, double d, Object o) {
    System.out.println(a);
  }
  public static void main (String argv[]) throws Exception {
    Class c = Test.class;
    Method method = c.getMethod("myMethod", new Class[] {
      int.class , char.class, double.class, Object.class }
    );
    method.invoke( t,
       new Object[] { 
           new Integer(5) ,
           new Character('c'),
           new Double(1.0D),
           new Object()}
    );
    System.in.read();  // only to see the result 
  }
}
Come vedi per ottenere le classi dei tipi primitivi basta aggiungere
.class al termine del descrittore di tipo, mentre per il mapping a
livello di invocazione di metodo basta utilizzare le classi wrapper
appositamente create per ciascuno dei tipi primitivi.
Ciao, Max.

    );
diventa 
    method.invoke( new Test(),
       new Object[] { 
           new Integer(5) ,
           new Character('c'),
           new Double(1.0D),
           new Object()}
    );
Non ho tempo di provarlo ma dovrebbe funzionare...
Ciao, Max.

classe.
Infatti lo e' :-)
Dalla documentazione del JDK: 
http://java.sun.com/products/jdk/1.1/docs/api/java.lang.Integer.html#TYPE
TYPE
    public static final Class TYPE
    The Class object representing the primitive type int.
Ciao,
    Bruno.


 |
