View Full Version : [JAVA] leggere un .class in un file .jar: it's possible ?
Frank1962
26-06-2003, 16:13
Ho un programmino aziendale scritto in java composto da vari file .jar ....in uno di questi c'è un file .class, il seguente:
package connection;
import java.util.TimeZone;
public interface This
{
public abstract String getaA();
public abstract int getAb();
public abstract int getAc();
public abstract int getAd();
public abstract int getAe();
public abstract int getAf();
public abstract int getAg();
public abstract float getAh();
public abstract float getAi();
public abstract float getAl();
public abstract float getAm();
public abstract long getAn();
public abstract float getAo();
public abstract float getAp();
public abstract int getAq();
public abstract long getAr();
public abstract void setTime(long l, TimeZone timezone);
public abstract boolean isTimeLocked();
public abstract void setTimeLock(boolean flag);
}
...dovrei riuscire a creare un programmino, sempre in java, che mi possa visualizzare i dati che caricano queste funzioni (credo numeri con virgola) e salvarli in automatico in un .txt!
...il problema è che oltretutto il .class si trova zippato nello jar e quindi non so se lo posso esportare così!! :(
:confused: non e' chiaro che devi fare. e poi e' un'interfaccia quella classe, quindi non e'implementata!!!
Frank1962
26-06-2003, 18:11
Originally posted by "ajez"
.....e poi e' un'interfaccia quella classe, quindi non e'implementata!!!
tradotto pls !? :confused: :cry:
alphacygni
26-06-2003, 22:50
uhm beh in soldoni diciamo che un'interfaccia di per se' non fa nulla... i metodi che vedi devi richiamarli da un'istanza di una classe che la implementa...
Frank1962
27-06-2003, 06:50
Originally posted by "alphacygni"
uhm beh in soldoni diciamo che un'interfaccia di per se' non fa nulla... i metodi che vedi devi richiamarli da un'istanza di una classe che la implementa...
:cry: :cry: :eek: :confused: :cry: :cry: :confused: :cry:
ps: ma è uno scherzo o stai dicendo sul serio :confused:
Se nel classpath includi il .jar contenente quell'interfaccia, puoi tranquillamente implementarla...
Cmq sono sicuro che esiste un'altra classe nel .jar che implementa già l'interfaccia da te indicata e i relativi metodi.Per salvare i dati in un file non c'è nessun problema, un qualunque tutorial ti può essere di aiuto...oppure se non hai voglia di leggere chiedi, ma a quel punto bisognerà vedere se avrò io voglia di rispondere :D
Originally posted by "Frank1962"
:cry: :cry: :eek: :confused: :cry: :cry: :confused: :cry:
ps: ma è uno scherzo o stai dicendo sul serio :confused:
e' vero. deve esserci da qualche parte una classe che implementa quell'interfaccia. quando hai scoperto il nome della classe, ti crei una variabile di quella classe e puoi richiamarne i metodi per ottenere i dati. l'interfaccia serve a dare uno scheletro dei metodi usabili e poi devi farti una classe (o piu') che implementi quei metodi. cosi' su un programma che usa certe classi di cui non sai niente a priori, ci metti sta interfaccia che comprende tutte le classi che la implementano. non so se e' chiaro :eek:
Originally posted by "Frank1962"
Ho un programmino aziendale scritto in java composto da vari file .jar ....in uno di questi c'è un file .class, il seguente:
...dovrei riuscire a creare un programmino, sempre in java, che mi possa visualizzare i dati che caricano queste funzioni (credo numeri con virgola) e salvarli in automatico in un .txt!
...il problema è che oltretutto il .class si trova zippato nello jar e quindi non so se lo posso esportare così!! :(
Forse ho capito male, ma a me sembra che tu voglia intercettare i dati che passano per questa interfaccia mentre il programma è in esecuzione , giusto?
Frank1962
27-06-2003, 20:20
Originally posted by "PGI"
Forse ho capito male, ma a me sembra che tu voglia intercettare i dati che passano per questa interfaccia mentre il programma è in esecuzione , giusto?
esatto !!!! ....dopo l'arabo finalmente un pò di italiano !!!! :D
Hai detto niente hai detto! :D Altro che arabo, personalmente non mai neanche pensato di fare una cosa del genere. Di sicuro è un problema interessante...
Potebbe servire qualche giorno per vedere se è possibile farlo senza passare per il reverse engineering del codice (cineseria che significa tradurre i file class in file sorgente che non sempre da' i risultati sperati). Un quarto di idea potrei anche averla, ma non garantisco nulla, se trovi altri suggerimenti seguili ad occhi chiusi.
In ogni caso mi faccio sentire.
Ciao.
Allo stato delle mie conoscenze "nun se po' fa'". :muro: Forse qualche programmatore che conosca bene C o altro potrebbe dirti come accedere agli indirizzi di memoria usati dalla jvm per l'esecuzione del programma, io in C riesco a stampare 10 volte "ciao mondo" sulla consolle e lì mi fermo.
Non è possibile usare la JNI (Java native interface, che permette di chiamare metodi in esecuzione in una jvm da un programma esterno) a meno che la classe che usa quell'interfaccia non assegni i valori restituiti dai metodi che implementa a dei campi accessibili (e questa è una cosa che potremmo sapere solo decompilando il file class che contiene il bytecode dell'oggetto che implementa l'interfaccia e non è detto che si capisca).
Non resta che trovare la classe che implementa l'interfaccia, decompilarla, cambiarle il nome e ricompilarla.
Poi ne crei un'estensione (una classa "figlia") e le dai lo stesso nome della classe "originale", riscrivi tutti i metodi in modo che richiamino quelli dell'interfaccia nella classe genitore e in più scrivano su un file o sulla consolle i valori che ti interessano.
Compili la classe e la sostituisci a quella "originale" presente nel file jar e aggiungi al jar anche la classe originale a cui avevi cambiato il nome.
Farlo potrebbe essere più complicato che dirlo.
Ciao.
theClimber
04-07-2003, 22:36
"se po' fa, se po' fa", dai un occhio a questo progetto OpenSource:
http://www.eclipse.org/aspectj
E' un estensione di Java che permette di aggiungere codice su punti di estensione (JoinPoint) che matchano certe condizioni (Esempio: chiamate a metodi, lancio e cattura di eccezzioni, accesso a variabili). Dalla versione 1.1 si puo' applicare anche a classi gia' compilate (ad esempio contenute in file jar)
C'e' comunque un po da studiare
theClimber
04-07-2003, 22:47
Originally posted by "PGI"
Non resta che trovare la classe che implementa l'interfaccia, decompilarla, cambiarle il nome e ricompilarla.
Poi ne crei un'estensione (una classa "figlia") e le dai lo stesso nome della classe "originale", riscrivi tutti i metodi in modo che richiamino quelli dell'interfaccia nella classe genitore e in più scrivano su un file o sulla consolle i valori che ti interessano.
Compili la classe e la sostituisci a quella "originale" presente nel file jar e aggiungi al jar anche la classe originale a cui avevi cambiato il nome.
Farlo potrebbe essere più complicato che dirlo.
Ciao.
Se puoi controllare l'instanziazione della classe, utilizzare questo metodo e' cmq assay + semplice, ed e' un ottima soluzione.
Una possibile variante a questa soluzione e' che la classe che intercetta i valori implementi l'interfaccia ma non estenda direttamente la classe da intercettare, ma contenga una variabile ad un istanza della classe.
I metodi possono quindi implementare una semplice delega all'oggetto contenuto. Perche' fare questo? dato che in java l'ereditarieta' multipla non esiste, questo potrebbe essere un metodo per simularla. (ad esempio potrei estedere 2 classi, una con il tradizionale extend el'altra mantenendo un implementazione di riferimento in una variabile di classe)
Ciao
Grande link, non sapevo neanche esistesse, lo stò scaricando per me :) .
Devo dire però che ho provato a leggere la documentazione e mi sembrava di essere un babbuino, avrò capito si e no una parola su 3. Ma sembra calzare a pennello col problema di queso post.
theClimber
04-07-2003, 23:14
Nella sezione link, sono referenziati un bel po di articoli teorici sull'aspect oriented programming (AOP), veramente meritevoli, dacci un occhio.
Ciao
Frank1962
05-07-2003, 06:47
grazie a tutti per le dritte ...ma sono sempre al punto di partenza :muro:
...non vedo cmq come questo aop possa risolvere il mio problema dato che mi sembra + che altro che la sua utilità sia quella di fornire metodi e tecniche per decomporre i problemi in un certo numero di componenti funzionali e un certo numero di aspetti....
( ps: frase presa da un sito.... che non so manco cosa voglia dire :D )
Brevissimamente, e stando a quello che ho capito perchè so dell'esistenza di AspectJ da 2 post (tra l'altro ho scoperto anche che c'è uno strumento analogo direttamente di IBM), puoi creare una classe separata da quelle che hai già in cui definisci un oggetto che reagisce ai metodi di altre classi senza, e qui sta il bello, avere riferimenti incrociati (che è quello che invece normalmente dovresti avere).
Per farlo dovresti creare una classe java usando quelle particolari estensioni del linguaggio che sono fornite appunto da AspectJ che "catturano" i metodi (ma non solo) di altri oggetti "viventi" (cioè durante l'esecuzione), compilarla con ajc.exe (un compilatore java esteso fornito con AspectJ) e...beh, in qualche modo la cosa poi funziona, solo che sono a metà della documentazione :cry: e ancora no so dirti di più.
Comunque è esattamente quello che cercavi, di queso ne sono sicuro, ed è molto meglio della ricompilazione delle classe che hai già.
Erano almeno 7 mesi che non vedevo più una cosa veramente interessante su Java, theClimber mi ha acceso una lampadina grossa come il sole :)
Certo che la documentazione è fatta proprio col http://forum.hwupgrade.it/faccine/24.gif e se quella sintassi è "un'estensione di quella di java" chi ha letto java per estenderlo http://forum.hwupgrade.it/faccine/51.gif
Frank1962
05-07-2003, 23:35
Originally posted by "PGI"
Per farlo dovresti creare una classe java usando quelle particolari estensioni del linguaggio che sono fornite appunto da AspectJ che "catturano" i metodi (ma non solo) di altri oggetti "viventi".........
dici estensioni tipo questa (http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/api/org/aspectj/lang/JoinPoint.html) ? :confused:
theClimber
06-07-2003, 06:57
Originally posted by "PGI"
Certo che la documentazione è fatta proprio col http://forum.hwupgrade.it/faccine/24.gif e se quella sintassi è "un'estensione di quella di java" chi ha letto java per estenderlo http://forum.hwupgrade.it/faccine/51.gif
In effetti se proprio c'e' una critica ad AspectJ e proprio il fatto che e' un attiminio complesso ;) e troppo potente per la maggior parte degli utilizzi.
Consiglio di trovare degli esempi tra la documentazione fornita e partire da quelli.
Tra gli articoli citati sul sito, questo sembra abbanstanza buono come punto di partenza:
http://www-106.ibm.com/developerworks/java/library/j-aspectj/index.html?dwzone=java
se proptio con Aspect J non se fa, ci sono anche i seguenti AOP:
HyperJ: http://www.research.ibm.com/hyperspace/index.htm
DemeterJ: http://www.ccs.neu.edu/research/demeter/DemeterJava/
JBoss: Jboss4 implementa una sua versione AOP dichiarativa in XML
Purtroppo non penso che i primi 2 possono applicarsi a Jar gia' compilati,
mentre JBoss si applica a runtime, ma dentro l'Application Server (Si aggiungerebbero i problemi di installazione e configurazione del server)
enjoy
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.