PDA

Visualizza versione completa : [Java] Invocare il main di una classe da un'altra


Dav82
15-09-2004, 13.04.48
Ciao a tutti!

Mi servirebbe una mano...

E' possibile chiamare, da una mia classe Java (tramite un metodo o qualcos'altro), l'esecuzione di una classe Java già compilata, di cui quindi ho già i .class, tramite il suo main, a cui passare dei parametri?

In sostanza ho una classe così:


public class UtilityClass{

public static void Main(String args[]){
//pastrugna un po' i parametri
}
}


e la vorrei chiamare da una mia classe così:


public class MyClass{

public mioMetodo(){
//fai qcosa per invocare il Main di UtilityClass
//con i parametri param1 e param2.
}
}


E' possibile o lo posso fare solo da riga di comando usando la solita sinstassi "java UtilityClass <parametri>" ?

Grazie! :) (B)

Dav82
15-09-2004, 15.24.31
Vabbè va, mi crocifiggo da solo, sono un pessimo programmatore.
Niente di più semplice che chiamare il metodo main... ma va te che uno non ci pensa.. uno pensa che main sia "speciale", che abbia la puzza sotto al naso e invece... :S

DavideDave
15-09-2004, 16.39.20
il main è un metodo come un altro ;)

solo che viene invocato in automatico nel caso la classe venga lanciata da riga di comando con il comando "java" ;)

Dav82
15-09-2004, 20.10.47
Originariamente inviato da DavideDave
il main è un metodo come un altro ;)

solo che viene invocato in automatico nel caso la classe venga lanciata da riga di comando con il comando "java" ;)

Eh già :S

Durante il pranzo mi è venuta l'illuminazione :D
Questa sera mi metto in ginocchio sui ceci davanti ad una tazza di caffè, per chiedere il perdono a San Java :D

P8257 WebMaster
16-09-2004, 10.51.40
Si ok funziona ..

però...

Cerchiamo di mantenere l'incapsulamento, le gerarchie ecc. che sono proprie della buona porgrammazione oop...

Il main è un metodo come gli altri .. può essere accettabile come definizione .. in realtà, se vogliamo parlare in termini analitici .. non lo è .. il "main" è l'entry point di un'applicazione inoltre è un metodo statico .. e i blocchi statici sono soggetti a convenzioni di chiamata diversi .. chiamarli "tradizionalmente" significa scardinare queste convenzioni di chiamata.

Non voglio criticarti Dav82, so benissimo che sei un programmatore molto capace e sai il fatto tuo .. scrivo queste righe perché potrebbero magari essere utili anche ad altri che si trovassero nella tua stessa situazione...

In questi casi di solito si cerca di spostare il codice eseguibile dalla main al costruttore o ad un terzo metodo chiamato dalla stessa main per poi richiamare tale metodo nelle occorrenze successive.

Ad esempio:
Classe chiamata (con main)

public class Classe1
{
public Classe1() {}

public Classe1(String args)
{
// codice eseguibile:
// pastrugno coi parametri
}


public static void main(String[] args)
{
// delego all'istanza della classe
// l'esecuzione del codice eseguibile.
new Classe1(args);
}

}


... classe chiamante...


public Classe2
{
private Classe1 C1;
// al posto di chiamare la main, utilizzo il
// costruttore o un
// secondo metodo che abbia all'interno il
// codice eseguibhile.
C1 = new Classe1("pippo", "pluto", "paperino");

public Classe2() {}

}


In questo modo si rispetta la logica e le convenzioni di chiamate dei metodi statici .. e anche il ruolo del "main" .. che verrà eseguito nel caso in cui la classe sia lanciata dal runtime java, ma che non sarà poi chiamato all'interno delle altre classi chiamanti.

NOTA: L'overload del costruttore è necessario, in quanto .. se non lo facessi, il codice eseguibile verrebbe chiamato sia all'atto della costruzione della classe, che dalla main, nel caso in cui lanciassi tale classe col comando java...

Bye :cool:

Dav82
16-09-2004, 14.43.40
Tutto perfetto, grazie Web! :) (Y)

Eh, averla potuta scrivere io quella classe... :crying:
Purtroppo fa parte di una libreria che ho scaricato, e si integra in un altro programmone mega galattico, e metterci le mani è un po' una tragedia... e i geni che l'hanno scritta, hanno fatto le API Java per tutto il resto, tranne che per usare sta classe, che può essere solo fatta partire dal main, perchè ha tutto lì dentro :S Per vedere cosa faceva ho dovuto usare un bel convertitore .class -> .java, altrimenti mi sognavo di far funzionare il tutto :S

Era un po' che non ti si vedeva, tutto bene? :)

P8257 WebMaster
16-09-2004, 16.27.55
Ah .. ok .. lo dicevo in linea di massima ... pensavo che l'applicativo fosse proprio stato progettato così ..

L'hai usato il decompilatore eh .. ;-).. meno male che c'é .. certe volte serve.. :)

... Si, proprio dei geni a mettere tutto nella main.. un bel "metodone" e non ci si pensa più .. scritto da gente che ha sempre programmato procedurale, cosa ci scommetti? ...

Bye :cool:

P.S.: ho latitato.. prima le vacanze, poi il lavoro mi rincorreva .. ma per fortuna sono più veloce di lui .. :D

P.P.S.: sto mettendo giù le specifiche della battaglia navale, conto anche su di te! :)

DavideDave
17-09-2004, 09.58.28
il JAD rulla :cool: