Newsgroup: it.comp.java
Titolo: java.lang.reflect

Ho qualche problema nell'uso della classe java.lang.reflect.
Il programma seguente, carica una classe per nome ("Concatena") poi ne
cerca il metodo concat1 che prende
come parametri due stringe e ne resituisce l'unione, e lo invoca con il
metodo invoke.
E fin qui va tutto bene, ma come faccio se devo invocare un metodo che
non ha parametri?
Grazie in anticipo.
Di seguito il codice della classe Prova.
import java.lang.reflect.*;
import java.lang.Class.*;
public class Prova
{
 public static void main(String args[])
 {
  Object pz=new Object();
  Class classe;
  try{
   classe=Class.forName("Concatena");  //carica la classe Concatena
   try
   {
    pz=classe.newInstance();   // crea una istanza della classe
Concatena e la associa a pz
   }
   catch (InstantiationException e)
   {
    System.out.println("InstantiationException");
   }
   catch (IllegalAccessException e)
   {
    System.out.println("IllegalAccessException");
   }
   Method met;          // Crea un oggetto di tipo Method
   try
   {
    Class cl[]=new Class[2];     // crea l'array di oggetti Class da
passare a getMethod
    cl[0]=Class.forName("java.lang.String");
    cl[1]=Class.forName("java.lang.String");
    met=classe.getMethod("concat1",cl);   // Recupera il metodo concat1
    try
    {
     String temp;
     Object ob[]=new Object[2];    // crea l'array di oggetti Object a
cui assegnare i parametri
     ob[0]=new String("stringa1");
     ob[1]=new String("stringa2");
     temp=(String)met.invoke(pz,ob);   // invoca il metodo concat1
     System.out.println(temp);
    }
    catch(IllegalAccessException e)
    {
     System.out.println("IllegalAccessException");
    }
    catch(IllegalArgumentException e)
    {
     System.out.println("IllegalArgumentException");
    }
    catch(InvocationTargetException e)
    {
     System.out.println("InvocationTargetException");
    }
   }
   catch (NoSuchMethodException e)
   {
    System.out.println("NoSuchMethodException");
   }
   catch(SecurityException e)
   {
    System.out.println("SecurityException");
   }
  }
  catch (ClassNotFoundException e)
  {
   System.out.println("ClassNotFoundException");
  }
 }
}

 Grazie in anticipo.
Devi passare null come array di classi (i tipi) e null come array di
oggetti (i valori).
Ugo

oggetti (i valori).
Object invoke(Object obj, Object[] args)
"obj" e' l'oggetto di cui si richiama il metodo, "args" e' l'array di
valori. Dov'e' l'array dei tipi? Il primo argomento puo' essere null
solo se il metodo e' statico (e quindi non necessita di una istanza
della classe).
Ciao.     Leonardo Boselli   
bos...@uno.it
   and
--   o    TETRACTYS Software 
tetr...@uno.it
 present
    o o   JOB - Java Objects Builder (0.9.4-05/17/99)
   o o o  Try it, it's FREE! <134 KB> <Java 2 needed>
  o o o o 
http://www.uno.it/utenti/tetractys/job.html

 della classe).
Intendevo l'array di Class che serve per trovare il metodo da invocare.
Penso (visto che ha parlato di problemi generici) che non abbia problemi
solo con Method.invoke(), ma anche con Class.getMethod(String name,
Class[] types). Quest ultimo metodo genera un reference ad un Method (o
solleva un'eccezione se non lo trova) che può poi essere "invokato"
tramite Method.invoke(Object obj, Object[] args). Gli args ovviamente
devono corrispondere con i types. In caso di assenza di parametri,
dunque, un bel null per cercare il metodo e un bel null per invocarlo
danno ottimi risultati!
Ugo
www.ugolandini.net