2 grundlegende Java-Fragen

  • 5 Antworten
  • Letztes Antwortdatum
S

Samsung I7500

Erfahrenes Mitglied
5
Moinsen!

Habe mal 2 Fragen zu Java.

1) In PHP gibt es funktionen wie z.B. call_user_method. Man übergibt dieser Funktion den namen einer Klasse und einer Methode, und dann ruft die Funktion die Methode innerhalb dieser Klasse auf. Gibts sowas auch in Java? Bzw. lässt es sich realisieren?

2) Mittels Intent kann man ja ne neue Activity starten. Dazu muss man der Funktion ne Klasse übergeben:

Intent(this,main.class);

Nun würde ich Klasse gerne dynamisch geladen ala:

String name = "main.class";
Intent(this,name);

(Wie) lässt sich das realisieren?

Danke schonmal ;)
 
Samsung I7500 schrieb:
Moinsen!

Habe mal 2 Fragen zu Java.

1) In PHP gibt es funktionen wie z.B. call_user_method. Man übergibt dieser Funktion den namen einer Klasse und einer Methode, und dann ruft die Funktion die Methode innerhalb dieser Klasse auf. Gibts sowas auch in Java? Bzw. lässt es sich realisieren?

Ich bin nicht sicher, ob ich verstehe, was du meinst. Soll es da einen Unterschied geben, zu dem, was der banale Punkt-Operator macht?

2) Mittels Intent kann man ja ne neue Activity starten. Dazu muss man der Funktion ne Klasse übergeben:

Intent(this,main.class);

Nun würde ich Klasse gerne dynamisch geladen ala:

String name = "main.class";
Intent(this,name);

(Wie) lässt sich das realisieren?

Danke schonmal ;)

Informier dich mal über die Reflection API.
 
Zu 2: Werd ich mir mal anschauen.

Zu 1:

PHP:
class foo {
    function bar() {

    }
}
In PHP hast Du 2 Möglichkeiten die Methode bar aufzurufen, entweder über den Scope Resolution Operator:

PHP:
foo::bar();
Oder aber über die call_user_method funktion:

PHP:
$class = "foo";
$method = "bar";
call_user_method($class,$method);
Nur dass beim Letzteren die Namen der Klasse/Methode aus einer Variable (in meinem Fall wiedermal ein String) kommen. So lassen sich Methoden halt dynamisch aufrufen, und mit method_exists() kann man zudem noch überprüfen, ob eine Methode innerhalb einer Klasse existiert, bevor man halt call_user_method() aufruft.

Läuft prinzipiell auf das selbe wie zu 2 hinaus, funzt mit der Reflection API wunderbar.

Danke! :)
 
Das ist beides Reflection. Allerdings ist das ziemlich teuer (==inperformant). Außerdem werden bspw. Refactorings nicht automatisch von Eclipse durchgeführt. Fehler fallen grundsätzlich erst zur Laufzeit auf. Wenn es möglich ist sollte man das vermeiden...

Was genau willst Du denn machen? ggf. fallen uns ja noch andere Lösungswege als Reflection ein, wenn wir die genaueren Anforderungen kennen. ;)

SirMArtin
 
Naja was hab ich wohl vor? Genau das, was Reflection da halt macht... ;)

Ich bastel mir grad ne App, die mit nem Server kommuniziert, und von diesem halt ne Ansage bekommt, welche Funktion sie bei bestimmten Aktionen aufrufen soll. Da sich das unter Umständen jedoch ändern kann, wollt ich das ganze halt dynamisch haben, ohne dass ich dafür extra die App updaten muss...
 
Naja. Die App muss ja die Funktion unterstützen. Sonst kann der Server ihr ja nicht mitteilen, dass sie diese Funktion auszuführen hat. Somit musst Du die App schon updaten, wenn ne neue Funktion hinzukommt.

Die Schnittstelle zum Server ist halt fix. Wenn Du die Aufrufe nur per String übergibst, brauchst Du zwar den Teil, der den String parst nicht anpassen. Die App an sich muss aber entsprechend reagieren. Somit hast Du die eigentliche Schnittstelle nur versteckt und tiefer in die Applikation verlagert, anstatt sie direkt in der Schnittstellenklasse umzusetzen. Seperation of Concerns ist hier das Stichwort. Jeder Klasse seine Zuständigkeit. Ein Mechanismus wie REST, SOAP oder XMLRPC sollte Dich hier interessieren.
Aus Entwicklersicht ist es komplexer, wenn Du Reflection nutzt anstatt einem typisierten Selektionsmechanismus.
Vielleicht sind ja auch entsprechende Frameworks für Dich interessant (Guice von Google bspw.).

Just my 2 cents.

SirMArtin
 

Ähnliche Themen

D
Antworten
23
Aufrufe
3.541
Data2006
D
L
Antworten
4
Aufrufe
1.500
lonnie9020
L
F
Antworten
5
Aufrufe
380
swa00
swa00
Zurück
Oben Unten