Newsgroup: it.comp.java
Titolo: Conoscere nome della classe e nome del metodo che istanziano un'altra  classe

Salve!!
Immaginate che una classe "B" venga istanziata dall'interno di una
classe "A".
Come faccio a sapere, dalla classe B, il nome della classe che la ha
istanziata (in questo caso "A") ed il nome del metodo -della classe A-
che ha istanziato questa classe "B" ?
Grazie

C'è un trucco, molto sporco e cattivo, che usa anche Log4j mi sembra,
e consiste in:
- lanciare un'eccezione *apposta*;
- catturarla;
- fare il parsing dello stack trace;
- ricavare nome della classe, del metodo e di tutto il cammino fino al
main()
Come trucco è proprio sporco, molto dispendioso e poco affidabile.
Penso però che sia l'unico... cross plaform, nel senso che c'è da
incrociare le dita :)
--
www.megadix.it

Grazie del consiglio, è veramente un trucco sporco.
A me serve xkè ho creato una classe Errore che lancio ( ...new Errore
(3, "descrizione errore"); ) quando durante delle operazioni mi
accorgo che qualcosa non va: per esempio se mancano dei file che
dovranno essere letti allora -seguendo il ramo di questo flusso di
controllo- passo all'istruzione new Errore(2, "NOME_FILE_MANCANTE")
dove quel parametro numerico == 2 viene utilizzato dallo switch,
dentro la classe Errore, per mostrare un certo msg d'errore a cui
aggiungo una descrizione più dettagliata, appunto indico precisamente
il NOME_FILE_MANCANTE.
E poi, a seguire, questo switch presenta una System.exit
(PARAMETRO_NUMERICO) per stoppare tutta l'esecuzione dell'applicazione
perchè, al verificarsi di questi "errori", ritengono che il programma
non debba proseguire.
Questa procedura come vi sembra?
Odio le try-catch e per questo ho ideato questo metodo, ma non mi ha
mai molto convinto.
Voi come fareste nei miei panni, sempre senza riccorere ad una try-
catch ?
Grazie

 catch ?
Usa un altro linguaggio, sempre sotto JVM se ne hai l'esigenza.
Personalmente mi trovo molto bene (in ambito web) con jython o groovy 
quando devo lavorare pesantemente su file xml (purtroppo talvolta 
capita... ;) ).
 > Questa procedura come vi sembra?
Mi sembra una try-catch-finally mascherata e resa inutilmente complessa.
Ciao.

 catch ?
mi metterei a studiare java dalle basi.
le eccezioni servono proprio a gestire questo tipo di situazioni e non 
ti puoi inventare accrocchi per delle gestioni alternative. fra l'altro 
visto che stai sollevando degli errori fatali esiste apposta 
java.lang.Error che non necessita dell' "odiato" try/catch.

 - lanciare un'eccezione *apposta*;
non c'e' bisogno di lanciare, se intendi una throw, una eccezione
i.e
private  static String findTrace(){
     java.lang.Exception objEx = new Exception();
     StackTraceElement[] aTrace = objEx.getStackTrace();
     String callerClass="";
     for (int i=0;i<aTrace.length;i++) {
         callerClass = aTrace[i].getClassName();
         if(callerClass.indexOf(".thisclassname")==-1) break;
     }
     String callerMethod = 
aTrace[i].getLineNumber()+"."+aTrace[i].getMethodName() +  ":";
     callerClass = callerClass.substring(callerClass.lastIndexOf(".") + 
1)+",";
     return 
logNoTrace.indexOf(callerClass)==-1?callerClass+callerMethod:"";
}
Non e' sicuramente immediata ma non  mi sembra particolarmente sporco e 
cattivo.
Peccato, se avessi aggiunto anche "brutto" sarebbe stata una splendida 
citazione ;-{) (metto questo altrimenti potrebbe essere frainteso)
cfr. 
http://it.wikipedia.org/wiki/Brutti,_sporchi_e_cattivi
--
ac

Quando programmo rimango sempre molto attento alle prestazioni e per
questo tendo a fare a meno delle eccezioni che, pur sempre nell'ambito
dei millisecondi, portano con se un certo ritardo.
Le conosco, non mi piacciono e non le uso.. se non nei casi
strettamente necessari (ad esempio quando devo parsare un file xml).
Appena posso proverò quel codice che mi è stato postato da Alessandro
Cara.
Per gli altri interventi avrei preferito leggere dei consigli più
azzecati del tipo "io-in-questi-casi-faccio-così" ..con a seguire il
loro suddetto codice che di solito usano: non ha molto senso dire
'mettiti a studiare le basi di java': il ng serve per conoscere vie
alternative ai nostri modi di programmare, ognuno ha il suo.. io, nel
mio, evito le eccezioni.
Ritengo che questa mia classe Errore sia veramente una zozzeria.. in
maniera più dolce me lo suggerisce anche il mio IDE intellij idea..
..per questo ho chiesto un parere: magari, se sono fortunato, qualcuno
mi presenta il suo buon metodo.. ci spero.
;-)

 --
eh eh, io effettivamente la chiamerei una "fasulada" :)
Tornando nel seminato, un paio di osservazioni:
1) le eccezioni vanno bene e si rimane felici usandole per quello che
sono, cioè segnalazione di errori non previsti e situazioni anomale,
punto. Niente controllo di flusso con le eccezioni, altrimenti il
codice, oltre a "spaghettizzarsi" (western per rimanere in tema),
subisce pure penalità nelle prestazioni.
2) per la gestione degli errori di Giordano, una domanda fondamentale:
se si verifica un errore, il tuo programma va avanti o si ferma?
Nel primo caso ti consiglio di realizzare una funzione per gestire
l'errore, alla quale passi anche il punto del programma che l'ha
generata.
Nel secondo caso userei le eccezioni, tanto se guadagni 100 cicli di
CPU che te ne fai, se poi ne usi 1M per mostrare il messaggio d'errore
sulla view ?
In ogni caso pensaci bene tu, perché sei effettivamente l'unico a
sapere com'è fatto il tuo codice :)
--
www.megadix.it

 catch ?
Cambierei idea sulle try-catch...
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html

 mi presenta il suo buon metodo.. ci spero.
Il metodo te l'hanno presentato ed è quello di usare le eccezioni come 
descritto dai manuali Java.
Prova a dare un occhio al tutorial della sun se vuoi conoscerlo meglio.
http://java.sun.com/docs/books/tutorial/essential/exceptions/index.html


 se si verifica un errore, il tuo programma va avanti o si ferma?
Beh, nel caso della mia applicazione, lancio questa classe
"Errore" (che mostra uno specifico msg d'errore e genera una trap
tramite una System.exit()) quando non trovo uno dei file da cui
leggere certe info assolutamente necessarie ai fini di tutta
l'eleborazione: pertanto preferisco che il programmi si fermi e non
vada oltre.
A conclusione di questa discussione mi sono fatto l'idea che è buona
cosa affidarsi alle eccezioni (pazienza anche se mi stanno
antipatiche) e rimandare la fase di ottimizazzione delle prestazioni
solo al momento in cui testerò una prima beta del mio applicativo.
Grazie a tutti.


ma passare un riferimento di A a B?