Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-03-2006, 13:26   #1
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
again java reflection: seconda domanda

Ecco una nuovo quesito sulla ormai mitica (almeno per me!!!) classe reflection:
Ho una classe , di cui a priori so che ne estende un'altra (Ereditandone quindi i metodi e i costruttori). Per esempio prendiamo class Pippo extends Disney
Se in una classe Warner carico Pippo (facendo la loadClass) poi posso invocare i metodi e i costruttori che sono definti nella classe Disney ma non esplicitamente in Pippo (metodi che cmq, in altri casi dove le reflection non servono, potrei utilizzare in quanto ereditati dalla superclasse)?
Mi scuso se a volte non sono chiaro nella descrizione dei miei problemi, ma non padroneggio ancora bene la classe reflect e l'applicazione che sto facendo è in costruzione, per cui spesso mi è difficile esplicare bene i miei dilemmi
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 14:11   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Bentornato,
quello che stai per implementare e' una tipica struttura, largamente utilizzata nelle architetture giudicate "buone" (complimenti).
La potresti vedere come un design pattern (tutto sommato, si tratta di una class factory, no?).

Veniamo alla domanda:da come l'hai posta, suppongo che tu, nella tua applicazione, conosca com'e' fatta la classe Disney. Pertanto la tua applicazione ne sa usare i relativi metodi.

Ora carichi dinamicamente la classe Pippo. L'informazione che hai su questa classe e' che essa estende la Disney, pertanto saprai usare i metodi ereditati (reimplementati...) dalla classe padre.

I metodi dichiarati nella classe Pippo li potresti ancora chiamare, a patto che ovviamente l'applicazione sappia cosa farne! E' solo questo il problema.

Se, per esempio, utilizzi questa struttura per fare una applicazione estendibile mediante un meccanismo "plug-in" (perche' no? come hai ben capito, e' piuttosto semplice con queste primitive...), e' chiaro che il programmatore di plug-in non conosce com'e' fatta la tua applicazione, sa solo che deve implementare delle interfacce. E la tua applicazione dovra' solo usare i metodi di quelle interfacce.
Se il programmatore di plug-in introduce il nuovo metodo
public void ciaoMamma()
non previsto dalla tua applicazione, la reflection te lo riportera' ma tu non saprai cosa farne, quindi non lo userai....

A proposito: ho parlato di interfacce, tu hai parlato di ereditarieta'. Generalmente in questi meccanismi la prima soluzione (polimorfica, quindi) e' da preferirsi.

Spero di aver risposto al quesito
High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 22:06   #3
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
Grazie per la risposta. Sei stato moto esauriente, ma ti chiedo un ultima precisazione, per vedere se ho ben capito. Ecco come è strutturata la famosa classe Pippo.
class Pippo extends Disney{
public Pippo(){super();}
}

So a priori che nella classe Disney vi sono dei metodi, che vengono ereditati da Pippo così come sono, senza implementarli ulteriormente. Posso cmq utilizzare tali metodi?
Oppure, per forza, vi deve essere, all'interno Pippo, qualcosa tipo
public void metodo(){super();}
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
Old 07-03-2006, 22:58   #4
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
Forse è bene che esplichi fino in fondo certi dilemmi:
Disney è in realtà la classe KeyAdapter per la gestione degli input da tastiera.QUindi ho una cosa del tipo
pippo extends KeyAdapter
Se io faccio la loadClass e poi faccio
Object p = classecaricata.newInstance;
mi creo una nuova istanza della classe caricata, ma perdo la dipendenza da KeyAdapter! Infatti non posso scrivere
addKeyListener(p)
perchè il compilatore da errore, in quanto ho passato un argomento per lui sbagliato...
Come posso raggirare questo problema?
PS: Risolto questo la mia applicazionè è moooooooolto avanti!La domanda non l'ho fatta prima perchè sono in pieno brainstorming e facendo tanti esperimenti non c'ho pensato prima (che è un modo elegante per dire che non so dove battere la testa! )
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2006, 07:10   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da DesmoColo
Forse è bene che esplichi fino in fondo certi dilemmi:
Disney è in realtà la classe KeyAdapter per la gestione degli input da tastiera.QUindi ho una cosa del tipo
pippo extends KeyAdapter
Se io faccio la loadClass e poi faccio
Object p = classecaricata.newInstance;
mi creo una nuova istanza della classe caricata, ma perdo la dipendenza da KeyAdapter! Infatti non posso scrivere
addKeyListener(p)
perchè il compilatore da errore, in quanto ho passato un argomento per lui sbagliato...
Come posso raggirare questo problema?
PS: Risolto questo la mia applicazionè è moooooooolto avanti!La domanda non l'ho fatta prima perchè sono in pieno brainstorming e facendo tanti esperimenti non c'ho pensato prima (che è un modo elegante per dire che non so dove battere la testa! )
Buongiorno,
questo in effetti e' un piccolo problema: se carichi dinamicamente l'oggetto, Java non puo' sapere tutta la sua gerarchia. Il tuo oggetto possiede i metodi ereditati da KeyAdapter, ma nel momento che la classe viene caricata ed istanziata, ti viene ritornato un Object.

Devi ovviamente farne il casting al tipo che ti interessa (KeyAdapter). Naturalmente devi essere sicuro che il tuo oggetto estende KeyAdapter, altrimenti avrai un'eccezione di cast runtime.

Direi che la tua applicazione e' mooooolto avanti, visto che il problema e' facilmente risolvibile. In bocca al lupo

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2006, 07:55   #6
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
Se ho capito bene tu dici di fare questo:
considerando ancora pippo extends KeyAdapter:
Object adp = costruttoreDiPippo.newInstance(new Object[]{parametri});
addKeyListener((KeyAdapter)adp);

In questa maniera il compilatore non segnala errori. Ma con questo casting se non sbaglio aggiungo nel listener un oggetto di tipo KeyAdapter, e non di Pippo (che estendeva tale interfaccia)...
Va bene ugualmente?
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2006, 07:57   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da DesmoColo
Se ho capito bene tu dici di fare questo:
considerando ancora pippo extends KeyAdapter:
Object adp = costruttoreDiPippo.newInstance(new Object[]{parametri});
addKeyListener((KeyAdapter)adp);

In questa maniera il compilatore non segnala errori. Ma con questo casting se non sbaglio aggiungo nel listener un oggetto di tipo KeyAdapter, e non di Pippo (che estendeva tale interfaccia)...
Va bene ugualmente?
No, aggiungi l'oggetto giusto: Pippo e' comunque un KeyAdapter e verranno invocati i suoi metodi (quelli che tu hai ridefinito)

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 08-03-2006, 22:26   #8
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
Ciao! Grazie dell'aiuto datomi fino ad ora. Sopratutto l'ultimo è stato prezioso.
Ancora una cosa non quadra...Ti riporto del codice che ho scritto.
Ho una classe siffatta:
Codice HTML:
public class Bruce extends Actor
    public int posX;
   public int posY;
   public Bruce(int x,int y){
      posX=x;
      posY=y;
    }
    }
Ho scritto poi una seconda classe dove all'interno vi è la seguente istruzione:
Codice HTML:
    Class classeAttore = ClassLoader.getSystemClassLoader().loadClass("Bruce");
    classiA[j]=classeAttore;

    /*mi creo una nuova istanza dell'attore*/
    Constructor cAtt =classeAttore.getConstructor(new Class[]{int.class,int.class});
    Object oft = cAtt.newInstance(new Object[]{10,10});
    oggettiA[h]=oft
    Method getX = classeAttore.getMethod("getX",new Class[0]);
                    Method getY = classeAttore.getMethod("getY",new Class[0]);
                    metodiX[j]=getX;
                    metodiY[j]=getY;
In seguito vi è un'altra istruzione:
Codice HTML:
    for(int h = 0; h < iterator+1;h++){
          Integer x = null;
           Integer y = null;
           int n=0;
           int k =0;
          System.out.println("x:="+x+";y:="+y);
          try{
              x = (Integer)metodiX[h].invoke(oggettiA[h],new Object[0]);
              y = (Integer)metodiY[h].invoke(oggettiA[h],new Object[0]);
           }catch(Exception e){}
           n= x.intValue();
           k = y.intValue();
Mi aspetterei che alla fine x.intValue() e y.intValue() avessero il valore 10, poichè l'oggetto era inizializzato con questi parametri..invece se stampo a video mi accorgo che sono 0.
Come mai? sbaglio qualcosa nella creazione e instanziazione dell'oggetto?
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
Old 09-03-2006, 16:17   #9
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Hai eccezioni?
Non ho seguito il codice (troppo complicato, dovrei farne una copia e farlo girare).
Il tuo debugger (o una semplice System.out.println()) ti dice che il costruttore e' stato invocato correttamente?

High Flying
Sottovento

PS scusa il ritardo nella risposta ma vivo qui da pochi mesi e devo ancora fare un casino di documenti...
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 09-03-2006, 19:44   #10
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
Nessuna eccezione sollevata.Tutto fila Ho fatto due getField sull'oggetto invovato. Mi spiego meglio. Inizializzo un oggetto (con la costrottore.newInstance(new Object[]{10,10})), poi mi ricavo i campi e faccio una stampa di questi. I campi sono settati giustamente (a video stampa x=10 y=10)
Ho controllato anche il contenuto dell'adapter e tutto ok...
Poi vado a stampare x.intValue() e y.intValue() (ricavate come dal codice cha hai visto) e questo sono entrambe 0
Anche i metodi sono giustamente invocati (ho stampato pure quelli)...
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 07:39   #11
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
scusa, stavo riguardando il codice. Hai detto che chiami la getX() e la getY() della classe Bruce, giusto?
Dove sono questi metodi? Nella classe Actor?

High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 11:05   #12
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
Si, sono due metodi che bruce eredita dalla classe Actor...
Se vuoi ti posso allegare per intero il sorgente della classe Actor, di Bruce e di BruceAdapter... cosi vedi come sono fatte queste classi che vengono poi invocate tramite reflection.
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 11:22   #13
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da DesmoColo
Si, sono due metodi che bruce eredita dalla classe Actor...
Se vuoi ti posso allegare per intero il sorgente della classe Actor, di Bruce e di BruceAdapter... cosi vedi come sono fatte queste classi che vengono poi invocate tramite reflection.
Scusa, avevo capito male!
In pratica, hai i metodi getX() e getY() nella classe padre.
La domanda che mi chiedevi e' se questi due metodi possono riportare il valore di posX e di posY della TUA classe, la quale estende Actor.

Veramente questi due metodi ritorneranno sempre e solo i valori di posX e posY (o come potrebbero chiamarsi) definiti nella class Actor, e non potrebbe essere altrimenti! Questi getter non sanno cosa hai definito DOPO...

Se la classe Actor definisce posX e posY come public o protected, allora potresti evitare di ridefinirli nella tua classe Bruce, e gli assegnamenti nel tuo costruttore farebbero riferimento alla copia in Actor. A questo punto i getter ritornerebbero il valore corretto.

In pratica, vedi sempre zero perche' viene tornato il valore delle variabili membro della classe padre, non la tua.
Scusami, nelle domande precedenti avevo capito un'altra cosa.

Se puoi, fai qualche prova e pubblica i risultati. Cmq se ovviamente ridefinisci questi getter, dovrebbe andare tutto correttamente


High Flying
Sottovento
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 10-03-2006, 14:02   #14
DesmoColo
Senior Member
 
L'Avatar di DesmoColo
 
Iscritto dal: Sep 2003
Città: Lucca
Messaggi: 379
Tutto OK!!!
Grazie 1000!
__________________
God rides DUCATI!
DesmoColo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
Apple potrebbe aver sospeso il progetto ...
Nintendo non seguirà l'esempio di...
Motorola ha lanciato un'app dedicata all...
Cyberpunk 2077 non si ferma e raggiunge ...
Samsung alza ancora i prezzi delle memor...
4 sconti tutti nuovi riscrivono la TOP 1...
Portatile HP con Intel Core Ultra 7 155H...
Smart TV Haier 50'' 4K crolla a 225,99€ ...
Google Pixel 10a a 399€ o 497€ (256GB) c...
Compare dal nulla e blocca lo schermo: c...
Tornano i super prezzi Nikon su Amazon, ...
Compatto, leggerissimo (1,2Kg), ma con 3...
Privacy Display per tutti i Galaxy S: Sa...
Le migliori cuffie in offerta su Amazon ...
SpaceX Starship: Ship 40 ha eseguito un ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v