Methoden per Übergabe eines "Methodennamen-Strings&quot

Status
Nicht offen für weitere Antworten.
J

jeremia

Gast
Tach, Leute!

Ich bin erst seit einem halben Jahr dabei, mir Java draufzuschaffen, insofern hoffe ich keine allzu blöde Frage zu stellen, aber ich hab's im Netz einfach nirgendwo gefunden:

Ich möchte, je nachdem, was in einem String steht, verschiedene Methoden eines Objektes aufrufen. Sagen wir mal, mein Objekt (ein AudioPlayer) hat die Methoden "play" und "stop".

Jetzt möchte ich, dass ein anderes Objekt, je nachdem, ob in einem String "play" oder "stop" steht, die Methode AudioPlayer.play() bzw. AudioPlayer.stop() aufrufen, möchte aber nicht per if/else jede Möglichkeit von Hand programmieren, sondern dass einfach die Methode, die dem Stringinhalt entspricht, aufgerufen wird. Sprich, ich suche eine Konstruktion à la

Code:
AudioPlayer.(Stringinhalt)()

Gibt's sowas?

Vielen Dank,
Jeremia
 

foobar

Top Contributor
Am einfachsten lässt dich sowas über Interfaces realisieren:
Code:
package demos.dispatcher;
import java.util.HashMap;

public class InterfaceDispatcher
{
	private HashMap data;
	public InterfaceDispatcher()
	{
		this.data = new HashMap();
	}
	
	public void invoke(String key)
	{
		((Action)this.data.get(key)).invoke();
	}
	
	public void addAction(String key, Action action)
	{
		this.data.put(key, action);
	}

	public void removeAction(String key)
	{
		this.data.remove(key);
	}

	public static void main(String[] args)
	{
		InterfaceDispatcher dispatcher = new InterfaceDispatcher();
		dispatcher.addAction("action1", new Action(){   public void invoke(){   new MyClass().doSomething();  }});
		dispatcher.addAction("action2", new Action(){ 	 public void invoke(){   new MyOtherClass().doSomethingElse();   }});
		dispatcher.addAction("action3", new YetAnotherClass());
		dispatcher.invoke("action3");
	}
}


//##########################################################################################
//##########################################################################################


interface Action
{
	void invoke();
}

// ##########################################################################################
//##########################################################################################

class MyClass
{
	public void doSomething()
	{
		System.out.println("Class "+ this.getClass() + " doSomething()");
	}
}

//##########################################################################################
//##########################################################################################

class MyOtherClass
{
	public void doSomethingElse()
	{
		System.out.println("Class "+ this.getClass() + " doSomethingElse()");
	}
}


//##########################################################################################
//##########################################################################################


class YetAnotherClass implements Action
{
	public void doSomethingCompletelyDifferent()
	{
		System.out.println("Class "+ this.getClass() + " doSomethingCompletelyDifferent()");
	}

	public void invoke()
	{
		this.doSomethingCompletelyDifferent();
	}
}
 
B

Beni

Gast
Und verschoben :D

Sowas kann man über die Klasse "Class" machen.

Code:
Class clazz = AudioPlayer.class;

Method method = clazz.getDeclaredMethod( "stop", new Class[0] );

method.invoke( irgendeinAudioPlayer, new Object[0] );
 
G

Guest

Gast
Supi, Leute!

Ich muss mir das jetzt beides erst mal in Ruhe angucken, aber schon mal vielen Dank!

Jeremia
 
R

Roar

Gast
also ich muss schon sagen dass die lösung mit den interfaces um einiges sauberer ist :?
 
B

Beni

Gast
Ja Roar, da hast du sicher recht. Aber dann braucht er trotzdem ein paar if's...
 

dotlens

Top Contributor
wie kann man denn eine Methode hinzufügen, die einen Parameter hat? habs versucht, aber man kann keine Variablen in inneren Klassen einbauen, die nicht final sind.

muss ich dass dann über ein Modell lösen? und die Daten dann beim aufrufen der Methode holen, oder geht das einfacher?
 

foobar

Top Contributor
wie kann man denn eine Methode hinzufügen, die einen Parameter hat? habs versucht, aber man kann keine Variablen in inneren Klassen einbauen, die nicht final sind.

muss ich dass dann über ein Modell lösen? und die Daten dann beim aufrufen der Methode holen, oder geht das einfacher?
Wo willst du eine Methode hinzufügen?
 

dotlens

Top Contributor
naja hab das wie oben gezeigt gemacht. meine methoden/actions hab ich in einem array gespeichert und beim letzten klick des Benutzers wird dann alles ausgeführt.
hab aber Probleme mit mehtoden, welche Parameter haben, weil in inneren Klassen die Variablen nicht erkannt werden....

soll ich den code posten oder war das verständlich?
 

dotlens

Top Contributor
hier das Grundsätzliche (eigentlich nur add methode wichtig):
Code:
	private Vector methoden = new Vector();

	public void addKopierenMethode(Action methode){
		methoden.addElement(methode);
	}
	public void removeKopierenMethoden(){
		methoden.removeAllElements();
	}
	public Action[] getKopierenMethoden(){
		//Enumeration methodenEnumeration = methoden.elements();
		Action[] methodenArray = new Action[methoden.size()];
		for(int i = 0; i < methoden.size(); i++)
			methodenArray[i] = (Action)methoden.elementAt(i);
		return methodenArray;
	}
hier füre ich hinzu:
Code:
	public void kopierenAlle(int welche) {
		switch (welche) {
			case 2:
				data.addKopierenMethode(new Action() {

					public void invoke() {
						controllerKopieren.kopierenAlleSymbole();
					}
				});
				data.addKopierenMethode(new Action() {

					public void invoke() {
						controllerKopieren.kopierenAlleFormen();
					}
				});
			break;
			case 11:
				data.addKopierenMethode(new Action() {

					public void invoke() {
						controllerKopieren.kopierenAlleSymbole();
					}
				});
			break;
			case 12:
				data.addKopierenMethode(new Action() {

					public void invoke() {
						controllerKopieren.kopierenAlleFormen();
					}
				});
			break;
		}
	}

eigentlich möchte ich aber die methoden so hinzufügen:
Code:
				data.addKopierenMethode(new Action() {

					public void invoke() {
						controllerKopieren.kopierenAlleFormen(eineVariable);//<------- Das wichtige
					}
				});

ach ja und das Interface:
Code:
interface Action{
	void invoke();
}

danke
 

foobar

Top Contributor
Dann mußt du ein zweites Interface anlegen, womit du einen Parameter entgegen nehmen kannst.
Code:
interface ParameterAction()
{
  void invoke(Object o);
}

Code:
data.addKopierenMethode(new Action() 
{
   public void invoke(Object o) 
   {
          controllerKopieren.kopierenAlleFormen( o ); 
    }
});
 

dotlens

Top Contributor
da sieht man wieder, dass ich das mit dem interface nicht verstanden habe, aber mein chef findet:
"mach noch n paar tools, kannst nachher wieder etwas lernen!" ;)

danke...
 

dotlens

Top Contributor
irgendwie funzt das aber nicht:

mein code:
Code:
data.addKopierenMethode(new ActionMitObj(String "test) {

					public void invoke() {
						controllerKopieren.kopierenEinzelneSymbole("test");
					}
				});

mein zusätzliches Interface:
Code:
interface ActionMitObj{
	void invoke(String string);
}
meine zusätzliche add Methode:
Code:
	public void addKopierenMethode(ActionMitObj methode){
		methoden.addElement(methode);
	}

was mach ich denn falsch?
 

dotlens

Top Contributor
bitte gebt mir doch eine antwort. auch wenn ihr nicht sicher seid. hab keine ahnung wie ich das machen soll. und in der API hab ich auch nichts gefunden....
 

foobar

Top Contributor
Code:
 data.addKopierenMethode(new ActionMitObj(String "test) {

               public void invoke() {
                  controllerKopieren.kopierenEinzelneSymbole("test");
               }
            });
Hier übergibst du den Wert an den Konstruktor von ActionMitObj, anstatt die Methode invoke mit dem Parameter aufzurufen.
 

dotlens

Top Contributor
danke für die Mühe, hat auch fast geklappt. aber dann hat das aufrufen mit invoke() nicht mehr geklapt. ich hätte im den Parameter nochmals übergeben müssen, hab in jedoch nirgends mehr gehabt.

also hab ich das ganze über ein DatenModel gelöst, in welches ich die Parameter speichere und wieder auslese. nicht gerad professionel, aber wenn ichs nicht besser kann :(
 

foobar

Top Contributor
danke für die Mühe, hat auch fast geklappt. aber dann hat das aufrufen mit invoke() nicht mehr geklapt. ich hätte im den Parameter nochmals übergeben müssen, hab in jedoch nirgends mehr gehabt.
So war das auch gedacht ;-). Falls du den Parameter nicht beim Aufruf mitgeben willst, erstellst du dir eben eine abstrakte Klasse die das ActionInterface implementiert und im Konstruktor einen Parameter entgegennimmt.
Code:
abstract class DefaultAction implements Action
{
    protected Object param;
    public DefaultAction(Object param)
    {
        this.param = param;
    }
}

Code:
 data.addKopierenMethode(new DefaultAction("test")
{
    public void invoke()
    {
       System.out.println("Method: invoke Parameter: " + this.param );
        // do something
    }
});
 

dotlens

Top Contributor
WOW! Du bist mein gott ;)

shat endlich geklappt. und die idee ist wirklich gut! versteh sie sogar ;)

danke vielmals
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
N abstracte klassen methoden Allgemeine Java-Themen 32
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
B Methoden Java Getter und Setter Methoden Allgemeine Java-Themen 9
Y Java Methoden unterschiedliche Zahlenreihen Allgemeine Java-Themen 2
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
D Methoden Methoden anpassen und fehlende Funktionen hinzufügen Allgemeine Java-Themen 475
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
L mehrere Methoden Allgemeine Java-Themen 19
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Q-bert Methoden Methoden in Java Allgemeine Java-Themen 13
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
E OOP Objekte und Methoden Allgemeine Java-Themen 1
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
T Java Array in Methoden Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
A Methoden verändern Allgemeine Java-Themen 12
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
Paul15 String Methoden Allgemeine Java-Themen 7
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Testen von Methoden Allgemeine Java-Themen 3
S "Vererben" statischer Felder/Methoden Allgemeine Java-Themen 4
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Methoden ohne Methodenkopf ?! Allgemeine Java-Themen 5
T Überschreiben von Methoden Allgemeine Java-Themen 6
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
S Methoden Methoden überschreiben Allgemeine Java-Themen 3
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
S Methoden Frage Allgemeine Java-Themen 2
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
M Methoden in Rescources speichern Allgemeine Java-Themen 4
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
A Vererbung finale Methoden überschreiben Allgemeine Java-Themen 24
A Methoden parallelisieren? Allgemeine Java-Themen 2
L Methoden methoden an generischen klassentyp anpassen Allgemeine Java-Themen 5
C Methoden Übernahme von standart nativen Methoden? Allgemeine Java-Themen 9
B Zusammenfassen verschiedener ähnlicher Methoden Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
MiMa Rekursive Methoden Allgemeine Java-Themen 3
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
F ListIterator (next & previous methoden) Allgemeine Java-Themen 5
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
T Methoden per String-Namen aufrufen Allgemeine Java-Themen 2
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
K Auf Methoden der Runnable Klasse zugreifen Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
D Passende Name für Methoden finden Allgemeine Java-Themen 3
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
GianaSisters ArrayList in Methoden übergeben Allgemeine Java-Themen 3
S static methoden Allgemeine Java-Themen 9
J coole Methoden Allgemeine Java-Themen 6
R Methoden in einem Thread unterschiedlich oft ausführen Allgemeine Java-Themen 4
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
P Methoden und Werte Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben