Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
MethodenMethode als String übergeben, dann aufrufen?
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.
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.
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...
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;
}
}
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.