Newsgroup: it.comp.java
Titolo: Re: interfacce e .. riflessione

 Paolo
Si è possibile. Si chiama reflection (non tradurlo in riflessione, è
brutto)
Class c = Class.forName("nomeclasse");
Method [] m = c.getDeclaredMethods();
Ti consiglio di guardarti le API riguardo la classe Class.
Ciao
Sandro
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ciao a tutti,
ho una classe che implementa un paio di interfacce.




Semplice no? estrai solo i metodi dell'interfaccia :D
Dopo che hai estratto i Method, per invocarli dovrai passare a invoke() 
l'oggetto su eseguire la chiamata e l'elenco degli argomenti sotto forma di 
array di Object. Se l'oggetto è un'istanza della classe che ti interessa, 
necessariamente possiede anche i metodi dell'interfaccia iniziale, quindi la 
chiamata passa.
Un po' di codice (chiedo scusa per la banalità):
public interface Car {
   public void start();
   public void stop();
   public void accelerate(int speed);
}
public class Lamborghini implements Car {
   public Lamborghini(String model) {}
   public void start() {}
   public void stop( {}
   public void accelerate(int speed) {}
   public void turbo() {}
}
import java.lang.reflect.*;
...
   public static void main(String[] args) {
      try {
         Class carInterface = Class.forName("Car");
         //Questi metodi non hanno argomenti
         Method startMethod = carInterface.getMethod("start",null);
         Method stopMethod = carInterface.getMethod("stop",null);
         //"accelerate" accetta un argomento intero. Utilizziamo
         //la classe wrapper per indicare il tipo primitivo
         Class[] accelSignature={Class.forName("java.lang.Integer")};
         Method accelMethod =
            carInterface.getMethod("accelerate",accelSignature);
 
         Lamborghini miaMacchina=new Lamborghini("Gallardo");
         //seeeeee.... magari ;)
 
         //le seguenti due chiamate hanno lo stesso identico risultato
         miaMacchina.start(); //Normalissima invocazione di funzione
         startMethod.invoke(miaMacchina, null); //Invocazione con reflection
 
         //anche usando i parametri...
         miaMacchina.accelerate(200);
         Object[] params={new Integer(200)};
         accelMethod.invoke(miaMacchina, params);
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
...
Nota come i Method siano stati ricavati dall'interfaccia Car, ma applicati 
all'oggetto miaMacchina di classe Lamborghini (...e che classe! :P).
Se davvero avessi una Lamborghini, sarebbe tutto più realistico... ma 
tant'è...
-- 
Fermiamo Scientology prima che sia troppo tardi!!!
http://xenu.com-it.net
  ---  
http://xenu.freewinds.cx
(per rispondere personalmente leva IlDitoDalCulo)

 
Allora vediamo:
   Class interfaccia=Class.forName("interfaccia");
            Method[] metodo = interfaccia.getMethods();
            metodo[2].invoke('Oggetto che implementa interfaccia', null);
Geniale !!
Perche questo...
Una classe ha tutta una serie di metodi che salvo o carico al bisogno.
Il problema è riuscire a mantenere un certo ordine in modo che possa capirmi
man mano che la classe cresce.
Così facendo, con un ciclo sull' interfaccia vedo solo quei metodi e
salvo(tutti quelli che cominciano con get) su un file i valori, viceversa
con un altro ciclo sempre sull' interfaccia carico i valori invocando i
metodi set sul file oltre al valore c'e anche il nome, per esempio se salvo
invoco i metodo che cominciano per 'get' trovo il valore e lo scrivo con un
nome che è il metodo senza 'get', se carico, ciclo il file trovo una coppia
valore nome, aggiungo 'set' davanti a nome e passo il valore come parametro
(a grandi linee).
Mi pare che in questo modo basta solo che aggiunga metodi get e set all'
interfaccia, li implemento nella classe e .. null' altro: si arrangia il
codice a trovarli, salvarli e caricarli.
Paolo

 Nota come i Method siano stati ricavati dall'interfaccia Car, ma applicati
Oops !! Ho postato senza leggerti !!
Comunque la cosa importante è che mi confermi ciò che ho trovato
stamattina :))))
Ora devo solo capire come tenere traccia anche del tipo di valore
Ciao 
        Paolo