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:
privatevoidtestfnc(){int foo;
foo =2;switch(foo){case1:bar("myMethod1()");break;case2:bar("myMethod2()");break;default:break;}}privatevoidbar(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.
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:
privatevoidtestfnc(){int foo;
foo =2;switch(foo){case1:bar("myMethod1()");break;case2:bar("myMethod2()");break;default:break;}}privatevoidbar(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.
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:
classMyObject{String name ="hans";int age =12;privateStringgetName(){return name;}privateintgetAge(){return age;}}privatevoidtestfnc(){int foo;
foo =2;MyObject obj =newMyObject();switch(foo){case1:bar("getName", obj);break;case2:bar("myAge", obj);break;default:break;}}privatevoidbar(String choice,MyObject obj){//do same thing on every choiceswitch(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:
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...
classMyObject{String name ="hans";int age =12;privateStringgetName(){return name;}privateintgetAge(){return age;}}privatevoidtestfnc(){int foo;
foo =2;MyObject obj =newMyObject();switch(foo){case1:System.out.println(obj.getName());break;case2: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...
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ß.
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"...
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.
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.
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.
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.