|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jan 2006
Città: Agrigento
Messaggi: 18
|
[java] Registrare un metodo
Salve,
ho la necessità di registrare un metodo.... Ho ad esempio una classe generica public class MiaClasse { public void do() { ... metodoRegistratoDaUtente() //questo metodo non lo so chi è sarà l'utente a dirmi quale sarà ... } } qualcuno ha idea di come si faccia ? |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jan 2002
Città: Bolzano
Messaggi: 283
|
fra l'altro non vedo l'utilità
![]()
__________________
"Without silence there can be no music" - Potf PC: Case: Cooler Master Centurion590; Ali: Corsair VX550; MB: Gigabyte EX-58-DS4; CPU: Intel Core i7 920; Dissi: Noctua NH-U12P SE1366; Ram: G.Skill 3x2GB DDR3 1333; Sk Video: GeForce GTX260 216SP; HD: Samsung Spinpoint 1TB; Monitor Iiyama E2403WS |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Sono di corsa, perdona la sintesi. Per aggiungere un metodo ad una classe dovresti usare il package instrument e correlati. Una via più semplice è appoggiarsi all'introspezione: non puoi aggiungere un nuovo metodo ad una classe ma puoi infilare un'intera categoria di oggetti nella jvm.
Codice:
import java.lang.reflect.*; public class MiaClasse { private String className, methodName; public void setMethod(String className, String methodName) { this.className = className; this.methodName = methodName; } public void doIt() { if(className != null && methodName != null) { invokeMethod(); } } private void invokeMethod() { try { Class c = Class.forName(className); Method m = c.getMethod(methodName); //no parameters method Object o = c.newInstance(); //no args constructor m.invoke(o); } catch(Exception ex) { ex.printStackTrace(); } } } Circa l'utilità, qualcuno direbbe che senza meccanismi di questa risma un programma non sarebbe che l'ombra di un sistema orientato agli oggetti =). |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jan 2006
Città: Agrigento
Messaggi: 18
|
Grazie mille....
però una cosa che non capisco è m.invoke(o); cosa fa ? Quali sono i parametri che passao al metodo ? (Ad esempio il metodo che registrerà l'utente ha bisogno di fue stringhe come parametri) Grazie |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Ma non puoi usare una semplice interfaccia con il tuo metodo?
Cosa devi fare di preciso?
__________________
|Java Base| |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
m.invoke(o);
è la versione riflessiva dell'espressione di invocazione di un metodo di nome m attraverso il riferimento o: o.nomeMetodo(); Per intero, invoke è: invoke(Object riferimento, Object... valori_per_i_parametri_del_metodo) dove ogni valore nel parametro variabile (...) è di un tipo compatibile in assegnamento con i parametri formali del metodo m, determinati all'atto dell'ispezione della classe: Method m = classe.getMethod(String nome, Class... tipi_parametri); |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
![]() prova a vedere se questo design ti può servire: Codice:
public interface Command{ public void execute(); } public class MyClass{ private Command myCommand; ... public void registerCommand(Command command){ myCommand=command; } public void do(){ .... myCommand.execute(); ... } } class FirstCommand implements Command{ void execute(){ //prima implementazione di command ... } } class SecondCommand implements Command{ void execute(){ //seconda implementazione di command ... } } ... class CommandFactory{ private CommandFactory(){} public static Command createCommand(int commandChoosed){ switch(commandChoosed){ case 1: return new FirstCommand(); break; ... } return null; } } ciau Ultima modifica di The3DProgrammer : 15-07-2006 alle 11:19. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:23.