Methoden Methode als String übergeben, dann aufrufen?

membersound

Bekanntes Mitglied
Hallo,

kann man einen Methodenname als String übergeben, und diese Methode dann irgendwie aufrufen?

Folgendes geht natürlich nicht, aber ihr versteht was ich meine:
Java:
    private void testfnc() {
        int foo;
        foo = 2;
        
        switch(foo) {
            case 1: bar("myMethod1()"); break;
            case 2: bar("myMethod2()"); break;
            default: break;
        }
    }
    
    private void bar(String choice) {
        //do something like:
        myObject.choice; //which would mean myObject.myMethod1() or myMethod2();
    }

Abhängig von foo möchte ich also immer die Methode bar aufrufen, aber der Inhalt dieser Methode unterscheidet sich immer nur um einen bestimmten Methodenaufruf.

Danke
 
Zuletzt bearbeitet:

pl4gu33

Top Contributor
Hallo,

kann man einen Methodenname als String übergeben, und diese Methode dann irgendwie aufrufen?

Folgendes geht natürlich nicht, aber ihr versteht was ich meine:
Java:
    private void testfnc() {
        int foo;
        foo = 2;
        
        switch(foo) {
            case 1: bar("myMethod1()"); break;
            case 2: bar("myMethod2()"); break;
            default: break;
        }
    }
    
    private void bar(String choice) {
        //do something like:
        myObject.choice; //which would mean myObject.myMethod1() or myMethod2();
    }

Abhängig von foo möchte ich also immer die Methode bar aufrufen, aber der Inhalt dieser Methode unterscheidet sich immer nur um einen bestimmten Methodenaufruf.

Danke

wäre es nicht einfacher in diesem Falle foo zu übergeben in die bar Methode und den Vergleich dort zu machen und die Methoden direkt aufzurufen ? :)
 

membersound

Bekanntes Mitglied
Also bei den Reflections steige ich nicht durch.

Zum Command pattern: vl habe ich mich unverständlich ausgedrückt, aber ich sehe nicht wo mir das helfen könnte.

Ich mach nochmal ein komplettes Beispiel:
Java:
    class MyObject {
        String name = "hans";
        int age = 12;
        
        private String getName() {
            return name;
        }

        private int getAge() {
            return age;
        }
    }
        
    private void testfnc() {
        int foo;
        foo = 2;
        MyObject obj = new MyObject();
                
        switch(foo) {
            case 1: bar("getName", obj); break;
            case 2: bar("myAge", obj); break;
            default: break;
        }
    }
    
    private void bar(String choice, MyObject obj) {
        //do same thing on every choice

        switch(choice) {
            case "getName": System.out.println(obj.getName());
            case "getAge": System.out.println(obj.getAge());
            default: break;

        //do same thing on every choice
    }

Die letzte Methode möchte ich jetzt verkürzen und ersetzen mit:
Java:
    private void bar(String choice, MyObject obj) {
        System.out.println(obj.choice);
    }

Im Fall von Command Pattern müsste ich mir dann ja doch viele einzelne Methoden schreiben: printName(), printAge() usw.
Das wollte ich ja gerade vermeiden...
 
B

bygones

Gast
warum so kompliziert ???

Java:
    class MyObject {
        String name = "hans";
        int age = 12;
        
        private String getName() {
            return name;
        }

        private int getAge() {
            return age;
        }
    }
        
    private void testfnc() {
        int foo;
        foo = 2;
        MyObject obj = new MyObject();
                
        switch(foo) {
            case 1: System.out.println(obj.getName()); break;
            case 2: System.out.println(obj.getAge); break;
            default: break;
        }
    }
Im Fall von Command Pattern müsste ich mir dann ja doch viele einzelne Methoden schreiben: printName(), printAge() usw.
Das wollte ich ja gerade vermeiden...
nein. beim command pattern arbeitest du mit einer methode und die implementierungen sind dann die versch. Methoden
Java:
public interface MyObjectPrinter {
   public void print();
}

private void testfnc() {
        int foo;
        foo = 2;
        final MyObject obj = new MyObject();
                
        switch(foo) {
            case 1: new MyObjectPrinter() { 
                               public void print() { 
                                     System.out.println(obj.getName());
                               }
                         }
                       break;
           }
    }
 
A

asdf1234

Gast
Du kannst dir das Leben natürlich auch mit den Apache-Commons um einiges leichter machen

Stichwort: MethodUtils, BeanUtils

Wobei trotzdem die Frage bleibt: Willst du das wirklich? Du hast bis jetzt noch nichts gezeigt, das den Aufwand rechtfertig. Und mit Reflection holst du dir etliche Nachteile mit ins Boot. Besonders, wenn du noch wenig Ahnung davon hast.

Kurz gesagt: Reflection ist in Händen vo Profis ein enorm mächtiges Konzept und die Basis vieler fortgeschrittener Frameworks. Als Anfänger solltest du aber erstmal einen weiten Bogen drum machen und dir lieber überlegen, wie du die Probleme "ordentlich" lösen kannst. Denn Reflection ist kein Holzhammer, mit dem man drauf los drischt, wenn man als Anfänger nicht mehr weiter weiß.
 

membersound

Bekanntes Mitglied
warum so kompliziert ???

Schon klar, dass das Beispie deutlich einfacher zu realisieren wäre.
Aber mir gehts ja eben darum, den Methodennamen weiterzureichen, und anhand dessen die zugehörige Methode aufzurufen.

Ob der Aufwand sich lohnt ist eine andere Frage, aber ich mach das hier primär um zu lernen. Und da versuche ich halt die Dinge, die ich mir in den Kopf gesetzt habe, zu hinterfragen und Lösungen zu finden. Wie eben hier mit dem "methodennamen weiterreichen"...
 

Antoras

Top Contributor
Aber mir gehts ja eben darum, den Methodennamen weiterzureichen, und anhand dessen die zugehörige Methode aufzurufen.
Macht in Java keinen Sinn. Das kann man in dynamisch typisierten Sprachen anwenden, aber nicht in Java.
Ob der Aufwand sich lohnt ist eine andere Frage, aber ich mach das hier primär um zu lernen.
Das einzige was man da lernt ist wie man es nicht machen sollte. Es funktioniert in Java nicht und fertig. Reflection ist nicht dazu gedacht dynamisch typisierte Programmierung mit Java-Code nachzubauen.

Wenn du Reflection lernen möchtest, dann versuche Java-Objekte zu serialisieren und aus serialisierten Informationen wieder Java-Objekte zu erstellen. Aber baue bitte keine dynamische Typisierung innerhalb von Java-Code nach.
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Es funktioniert in Java nicht und fertig. Reflection ist nicht dazu gedacht dynamisch typisierte Programmierung mit Java-Code nachzubauen.
Das ja mal 'ne Aussage :lol:
Gerade weil man Reflections sehr gut dafür prostituieren kann, funktionierts eben doch. Aber zu welch' Dummheiten man sich hinreissen lässt, bleibt jedem selbst überlassen.
Frage an den TS: Das soll nicht zufällig ein Script-Interpreter bzw. Compiler werden? Bei einem solchen hatte ich zumindest mal ein ähnliches Problem und ich muss sagen... Vergiss es, mit dem CommandPattern hast definitiv mehr Erfolg.
Java:
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

public class CommandPatternTest
{
	private static final Map<String, Command<?>> commands;

	static
	{
		Map<String, Command<?>> tmp = new TreeMap<String, Command<?>>();
		tmp.put("getName", new Command<String>()
				{
			@Override
			public String execute(Object ... parameters)
			throws Throwable
			{
				return getName();
			}
		});
		tmp.put("getAge", new Command<Integer>()
				{
			@Override
			public Integer execute(Object ... parameters)
			throws Throwable
			{
				return getAge();
			}
		});
		commands = Collections.unmodifiableMap(tmp);
	}

	public static void main(String[] args)
	{
		if(args == null || args.length == 0) {
			args = new String[] {"getName", "getAge"};
		}
		for(String arg : args) {
			try {
				System.out.println(commands.get(arg).execute());
			} catch(Throwable e) {
				e.printStackTrace();
			}
		}
	}

	private static String getName()
	{
		return "Spacerat";
	}

	private static int getAge()
	{
		return 43;
	}
}

interface Command<T>
{
	T execute(Object ... parameters) throws Throwable;
}
Lass dich vom statischen Kontext jetzt nicht täuschen, der existiert nur im KSKB. Dieses Inteface ist so konzipiert, dass "untypisierte" Parameter übergeben und typisierte Rückgabewerte verwendet werden können. Vor dem Aufruf der jeweiligen "execute"-Methoden, lässt sich der übergebene String (z.B. eine Kommandozeile) noch parsen, wodurch man evtl. noch Parameter erhält. Der Phantasie sind recht wenig Grenzen gesetzt.
 
Zuletzt bearbeitet von einem Moderator:

Antoras

Top Contributor
Gerade weil man Reflections sehr gut dafür prostituieren kann, funktionierts eben doch.
Naja, kommt darauf an wie man "funktionieren" definiert. Man kann das auch in Assembler programmieren. Ob man das da aber auch Bug-frei hinbekommt ist eine andere Sache.

Viel wichtiger ob es funktioniert oder nicht, dürfte aber sein, dass wir uns hier im Anfängerforum befinden. Jemand, der weiß wie er mit den ihm gegebenen Möglichkeiten umgeht, würde hier nicht nachfragen. Dem TO hingegen ist mehr geholfen wenn man ihm sagt wie er seine Ziele möglichst geschickt und fehlerfrei erreichen kann. Auf die "hidden features" kommt er schon noch früh genug und dann wird er auch damit umgehen können.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F String wird richtig in konsole geschrieben aber falsch an Methode übergeben Java Basics - Anfänger-Themen 8
G Methoden String übergeben in Methode Java Basics - Anfänger-Themen 17
K String und Zahl in Methode übergeben Java Basics - Anfänger-Themen 11
H String in Methode einer anderen Klasse übergeben Java Basics - Anfänger-Themen 5
A string an methode übergeben Java Basics - Anfänger-Themen 9
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
macle Rekursive String Methode, Gerade Zahlen rausfiltern Java Basics - Anfänger-Themen 10
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
M String außerhalb der main-Methode Java Basics - Anfänger-Themen 4
C Java String Methode Java Basics - Anfänger-Themen 6
D Methode mit Übergabe double und Rückgabe String Java Basics - Anfänger-Themen 2
T String an Methode zurückgeben Java Basics - Anfänger-Themen 2
J String Methode chars() Java Basics - Anfänger-Themen 8
F Ein Datum (int) durch Methode als String formatieren Java Basics - Anfänger-Themen 2
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
O String Methode für längste Sequenz von Leerzeichen Java Basics - Anfänger-Themen 35
geekex Double zu String umwandeln in einer Methode Java Basics - Anfänger-Themen 28
J String splitten und weiter einarbeiten in einer Methode? Java Basics - Anfänger-Themen 11
V Methoden Rekursive Methode mit String als Rückgabe Java Basics - Anfänger-Themen 7
S Datentypen Mit einer Methode String arrays geben Java Basics - Anfänger-Themen 9
G Variabel: Nach String benannte Methode ausführen Java Basics - Anfänger-Themen 13
T String toString methode nicht vererbt ... Java Basics - Anfänger-Themen 4
M Möglich? Methode aufrufen deren Bezeichner zur Laufzeit durch einen überg. String festgelegt wird Java Basics - Anfänger-Themen 3
TheSorm String zu Methode machen Java Basics - Anfänger-Themen 1
S equals Methode bei String Java Basics - Anfänger-Themen 5
S Methoden Methode soll String zurückgeben Java Basics - Anfänger-Themen 11
P Methode die String auf Zeichen überprüft Java Basics - Anfänger-Themen 2
W Schlüsselworte Methode, die die grösste Zahl aus einem String ermittelt und zurückgibt Java Basics - Anfänger-Themen 8
S Methode contains beim String Java Basics - Anfänger-Themen 2
N String kombinieren - Methode Java Basics - Anfänger-Themen 5
M OOP Methode überschreiben mit String-Paramter unterschiedlicher Größe? Java Basics - Anfänger-Themen 19
G Erste Schritte String fs. Methode Java Basics - Anfänger-Themen 9
N Methode die String in char-Array wandelt!! Java Basics - Anfänger-Themen 11
S Main Methode String... args Java Basics - Anfänger-Themen 2
W OOP Methode mit String von this Java Basics - Anfänger-Themen 3
V Datentypen Methode gesucht, String zu Double mit Rechenoperatoren Java Basics - Anfänger-Themen 11
M Frage zur Methode Action.putValue(String,Object) Java Basics - Anfänger-Themen 5
S Datentypen String mit fester Länge (Rückgabewert einer Methode) Java Basics - Anfänger-Themen 2
N main Methode und String Java Basics - Anfänger-Themen 11
J String Methode Java Basics - Anfänger-Themen 7
F String split-Methode Java Basics - Anfänger-Themen 12
P Methode um einen String zu überprüfen Java Basics - Anfänger-Themen 12
T Klasse String enthält Methode value? Java Basics - Anfänger-Themen 2
I neue Methode zu Classe z.B. String hinzufügen Java Basics - Anfänger-Themen 7
G String mit next()-Methode einlesen - keine Leerzeichen! Java Basics - Anfänger-Themen 11
D Probleme mit der String Methode replace() Java Basics - Anfänger-Themen 4
F String Methode subString() Java Basics - Anfänger-Themen 7
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
M Methode sperren bis ein Kriterium erfüllt wurde Java Basics - Anfänger-Themen 3
D Switch Case Methode aufrufen Java Basics - Anfänger-Themen 3
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
Ostkreuz Methoden Von Dezimal zu Hexadezimal Methode toHex Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
D Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben