Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen?

nonickatall

Mitglied
Ich suche eine Lösung für folgendes Problem:

Angenommen ich möchte eine Methode in einer anderen Klasse aufrufen.

Dann mache ich das ja beispielsweise mit:
Java:
SMS.start(Parameter1);

Oder als Objekt mit

Java:
SMS sms1 = new SMS();
sms1.start(Parameter1);

Nun ermittle ich aber den Methodenaufruf, erst aus einer Tabelle, habe den Wert also in einer Variablen.
Also zum Beispiel:

Java:
String Aufruf = "SMS.start(Parameter1);";

Und will dann diesen Variablen Inhalt ganz normal als Methode aufrufen. Geht das irgendwie?

Hier, wenn es interessiert, warum ich das machen will..:

Vielen Dank im Voraus
 

mrBrown

Super-Moderator
Mitarbeiter
Ja, das geht schon – ist aber in den meisten Fällen die schlechtere Variante.

In deinem Fall würde es ja am Ende nur dazu führen, dass der eigentliche Code als String in der Datenbank steht, und zB auch gar kein Typechecking o.ä. vor der Laufzeit stattfindet.

Vermutlich gäbe es für deinen Fall bessere Varianten, in Richtung eines Plugin-Systems. In der Datenbank stand sowas wie "Plugin XY soll ausgeführt werden", und das Programm reagiert dann entsprechend, dass kann man auch relativ abstrakt und gleichzeitig vernünftig programmiert halten.

Hängt ein bisschen davon ab, was deine Module alles können sollten bzw wie sie generell funktionieren sollen, aber im Allgemeinen lässt sich das so umsetzen. Je nachdem, was konkret gefordert ist, ist es u.U. auch sinnvoll, auf irgendein bestehendes Framework aufzusetzen.
 
G

Gelöschtes Mitglied 65838

Gast
Java:
import java.lang.reflect.Method;

class Kyle {

    public void Test(){System.out.println("invoking Test()");}

    public void Ronaldo(){System.out.println("invoking Ronaldo()");}

    public void MakeThis(){System.out.println("invoking MakeThis()");}



    public static void main(String[] args) throws Exception{

        Kyle k=new Kyle();

        String text = "Test";

        Class c=k.getClass();

        Method m=c.getDeclaredMethod(text);

        m.invoke(k);

    }

}

das ruft eine Methode über einen String auf
 

Oneixee5

Top Contributor
Für die Reflektion-API sehe ich hier keine Notwendigkeit. Ich würde auch davon abraten. Keine Typsicherheit, zu wenig Kontrolle usw. Am Ende musst du ja nur eine Bedingung auswerten: welche statische Methode welcher Klasse soll gestartet werden. Dann startest du diese einfach. Im simpelsten Fall ist das ein If-Else-Konstrukt. Die Parameter legst du am besten gesondert, z.B.: in einer anderen Spalte in der DB ab. So wie du das verwenden willst, müssen die Klasse und Methoden dem Programm sowieso bekannt sein.
 

nonickatall

Mitglied
Ja, das geht schon – ist aber in den meisten Fällen die schlechtere Variante.

In deinem Fall würde es ja am Ende nur dazu führen, dass der eigentliche Code als String in der Datenbank steht, und zB auch gar kein Typechecking o.ä. vor der Laufzeit stattfindet.

Vermutlich gäbe es für deinen Fall bessere Varianten, in Richtung eines Plugin-Systems. In der Datenbank stand sowas wie "Plugin XY soll ausgeführt werden", und das Programm reagiert dann entsprechend, dass kann man auch relativ abstrakt und gleichzeitig vernünftig programmiert halten.

Hängt ein bisschen davon ab, was deine Module alles können sollten bzw wie sie generell funktionieren sollen, aber im Allgemeinen lässt sich das so umsetzen. Je nachdem, was konkret gefordert ist, ist es u.U. auch sinnvoll, auf irgendein bestehendes Framework aufzusetzen.
Das ist richtig Typechecking wäre damit dann schlecht möglich. Das wäre nicht so wichtig weil das nicht soviel ist und das sich auch nicht ständig ändert.

Was meinst du mit einem Plugin System? Und wie könnte ich das realisieren?

Die Module sind halt im wesentlichen ein SMS Modul zur Kommunikation, das nur auf einem Gerät ausgeführt wird. Dann entsprechende GPIO Module die natürlich abhängig von den angeschlossenen Geräten sind. GUI Modul das natürlich nur an dem Gerät ausgeführt wird wo auch ein Bildschirm hängt. Und andere Kleinigkeiten.
 
K

kneitzel

Gast
Also erst einmal ist die Frage, ob Du ein Plugin System brauchst. Das ist dann sinnvoll, wenn Du Plugins dynamisch dazu oder weg nehmen willst. Also z.B. schreibst Du ein Produkt und ich erweitere es dann durch ein eigenes Plugin...

Generell reicht es, dass Du irgendwas baust, dass mögliche Aufrufe verwaltet. Das kann schon eine einfache Map sein, z.B. eine Map<String, Consumer<SomeData>> (Sprich: Nutz den functional Part , den Java mit Java 8 bekommen hat, Namespace java.util.function)

SomeData kann dann eine Klasse sein, die Daten enthält, die notwendig sind:
- Das können z.B. wichtige Referenzen auf andere Instanzen sein, die dann verwendet werden können sollen.
- Das kann aber auch eine Art Konfiguration sein. Du hattest da ja sowas wie Parameter vorgesehen. Das könnten also z.B. einfache Key/Value Paare sein.

Und in deinen Klassen kannst Du dann beliebige Methoden haben, die halt SomeData als Parameter entgegen nehmen und nichts zurück geben (*).

Dann musst Du bei der Initialisierung nur die Map füllen. Und wenn dann aus der Datenbank ein Task gelesen wird, dann schaust du in der map nach und rufst den Consumer auf.

(Statt eines Consumer, der nichts zurück gibt, kannst Du auch eine Function nutzen - dann hast Du noch einen Returntyp Deiner Wahl.)

Wenn es das Plugin System sein soll, dann wäre halt mein Ansatz, dass man die sogenannten Service Provider verwendet. Das ist eine Methodik, die seit Java 6 vorhanden ist und z.B. von JDBC verwendet wird. Ein jar File kann dann angeben, dass es einen Service anbietet und darauf kann dann zugegriffen werden ohne viel eigenen Code. Siehe dazu z.B. https://www.baeldung.com/java-spi

Und auch hier noch einmal mein Ratschlag: Fang am Anfang mit weniger Features an und bau ein erstes Produkt. Das kannst Du dann nach und nach erweitern. Ansonsten fürchte ich, dass Du die Erfahrung machst, die viele am Anfang machen dürfen: Es wird an zu vielen Stellen gleichzeigt gebastelt und dann ist relativ schnell der Überblick weg, die Erfolgserlebnisse bleiben aus und das Projekt landet in der Ecke ... Aber da muss ich mich nicht wiederholen - das hatte ich Dir im anderen Thread schon als Ratschlag gegeben, daher vertiefe ich das auch nicht erst weiter.
 

nonickatall

Mitglied
So, ich habe das ganze noch mal überdacht, und vor allem das Thema Typechecking und dass ich im Grunde genommen gar nicht so viele Module habe, hat mich überzeugt von diesem Ansatz Abstand zu nehmen und das lieber mit entsprechenden if Statements zu lösen.

Danke an alle
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N abstracte klassen methoden Allgemeine Java-Themen 32
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
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
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
C Problem Methoden, Klassen, Listen Allgemeine Java-Themen 27
R Ableiten - Methoden aufruf bei abgeleiteten Klassen Allgemeine Java-Themen 4
E Doku zu Servlets (Klassen und Methoden)? Allgemeine Java-Themen 3
F deutsche namen für verben/substantive für Methoden/Klassen Allgemeine Java-Themen 10
P Ungenutzte Klassen und Methoden finden Allgemeine Java-Themen 2
S Statische Methoden in abstrakte Klassen deklarieren? Allgemeine Java-Themen 17
S Konstruktoren, verschiedene Klassen, Methoden. Allgemeine Java-Themen 3
MQue Methoden in verschiedenen Klassen aufrufen Allgemeine Java-Themen 21
MQue static Methoden/Klassen Allgemeine Java-Themen 7
M Dynamisches ausführen von methoden unbekannter klassen Allgemeine Java-Themen 6
T Klassen samt Methoden aus Jar-Archiv laden macht Problem Allgemeine Java-Themen 9
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
Zrebna Wie ermittelt man alle testbaren (zu testenden) Klassen in seinem Maven-Projekt? Allgemeine Java-Themen 23
8u3631984 Jacoco Testcoverage bei Abstracten Klassen in verschachtelten Modulen Allgemeine Java-Themen 6
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
B Wie kann ich mein 8 Klassen Gebilde objektorientierter schreiben? Allgemeine Java-Themen 114
W Klassen Zugriff auf ein Textfile aus allen Klassen. Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
B Problem mit meinen Klassen Allgemeine Java-Themen 6
I Array Parameter mit 2 Klassen - NullPointerException Allgemeine Java-Themen 3
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
F Code in Klassen bringen Allgemeine Java-Themen 4
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
F Klassen Verwendung abstrakter Klassen Allgemeine Java-Themen 9
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
D Klassen JLabels in anderen Klassen verwenden. Allgemeine Java-Themen 7
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
J Best Practice Objekt an alle Klassen verteilen ( Discord Bot ) Allgemeine Java-Themen 7
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
cool_brivk24 Klassen Klassen Aufruf Fehlgeschlagen Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
S Klassen Abstrakte Klassen Allgemeine Java-Themen 5
T Log4J - Deaktivierung für einzelne Klassen Allgemeine Java-Themen 7
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
Sin137 Struktur der Klassen & Package Allgemeine Java-Themen 2
G Klassen und interne Klassen Allgemeine Java-Themen 1
S Klassen übergeben Allgemeine Java-Themen 13
C Klassen und Konstruktor Allgemeine Java-Themen 2
S Classpath Wie kann ich Java-Library Klassen "verstecken"..? Allgemeine Java-Themen 4
A Java speech - 2 Klassen Allgemeine Java-Themen 1
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
V Klassenname von allen Klassen mit einer bestimmten Eigenschaft bekommen Allgemeine Java-Themen 2
B Classpath Eclipse findet importierte Klassen nicht Allgemeine Java-Themen 1
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
C Arten von Klassen Allgemeine Java-Themen 3
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
O Klassen Programm in Klassen unterteilt, werte werden nicht mehr übernommen Allgemeine Java-Themen 3
J C++ Projekt (QT) in Java mit Klassen (nicht imperativ) nutzen (BridJ? JavaCPP? SWIG? JNA? JNI?) Allgemeine Java-Themen 2
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
S .jar hat nicht alle Klassen ??? Allgemeine Java-Themen 10
S Polymorphie Polymorphismus bei Abstrakten Klassen Allgemeine Java-Themen 2
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
T Wie kann ich alle existierenden Java-Klassen anzeigen lassen? Allgemeine Java-Themen 10
Landei Welche Klassen fehlen im JDK? Allgemeine Java-Themen 18
S Kapselung Statische Helper Klassen Allgemeine Java-Themen 5
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
N Java Klassen mit ID Allgemeine Java-Themen 21
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
S JPA und Entity-Klassen: Wert ungültig Allgemeine Java-Themen 6
M OO / Klassen / Projektstruktur Allgemeine Java-Themen 5
O Klassen werden nicht importiert Allgemeine Java-Themen 3
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
A Klassen und JLabel's Allgemeine Java-Themen 12
J Java-Implementierung diverser Beziehungen zwischen Klassen bzw. Objekten Allgemeine Java-Themen 2
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
E instanceof mit nicht öffentlichen Klassen Allgemeine Java-Themen 2
D Datentypen Typbestimmung unbekannter Wrapper-Klassen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben