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.
so fragst du die Klasse nach dem Method-Objekt,
was ohne Parameterangabe auch noch evtl. nicht klappen könnte
ausgeführt wird die Methode aber auf jeden Fall nicht,
so ein richtiges Thema bitte länger als 5 Min. anschauen, auch google bemühen (Beispiele!),
und wenn, dann erstmal in einem neuen kleinen Test-Programm mit main-Methode ausprobieren,
nicht irgendwo zwischen sowieso schon komplizierten Actions und Listener vergraben
Von dieser Art der Methodenübergabe hast du schon gehört, oder?
Code:
interface MyMethod{
public void doSomething();
}
class A{
public static void main(String[] args){
new A(new MyMethod(){
public void doSomething(){
System.out.println("Blablubb");
}
});
}
public A(MyMethod method){
method.doSomething();
}
}
Keine Ahnung was du mit deinem Code vorhast, mmn ist aber so eine Lösung Reflection vorzuziehen
EDIT: Falls du auf fertige Methoden zugreifen willst, die als normale Methoden im Klassencode drinstehen, kannst du ja auch einfach sowas als Paramter übergeben:
Code:
new MyMethod(){
public void doSomething(){
meinObject.führDeineSpezielleMethodeAus();
}
}
auf jeden Fall, also meiner meinung nach ist Reflection nur was für Ausnahmefälle.. wenns wirklich gar nicht anders geht!
Im normallfall sollte man eine art command pattern benutzen. So wie Schandro es gezeigt hat. Du hast Klassen die alle ein Interface implementieren, das praktisch eine "ausfürhen" Methode definiert....
sowas wie Funktionspointer oder wie in javascript dass man einfach einen methode mitgibt... gibts in java leider nicht.... noch nicht ;-)
In meinem Programm wird ein JXTaskPaneContainer definiert, der seine JXTaskPanes aufnimmt. Jedes dieser Panes kann ja mehrere Einträge enthalten. Derzeit habe ich es so realisiert, wie es die SwingX-Doku zeigt:
Code:
openpanel = new JXTaskPane();
openpanel.setTitle( "Open" );
openpanel.add( new AbstractAction()
{
{
putValue( Action.NAME, "Open" );
}
public void actionPerformed( final ActionEvent ev )
{
taskopen();
}
} );
openpanel.add( new AbstractAction()
{
{
putValue( Action.NAME, "New" );
}
public void actionPerformed( final ActionEvent ev )
{
tasknew();
}
} );
openpanel.add( new AbstractAction()
{
{
putValue( Action.NAME, "New with defaults" );
}
public void actionPerformed( final ActionEvent ev )
{
tasknewdefaults();
}
} );
Das sieht noch recht übersichtlich aus. Ich habe den Code ja hier auch gekürzt. Tatsächlich werden pro neuer AbstractAction mehrere putValue-Angaben gemacht und weitere Einstellungen. Wenn jede TaskPane nur 5 solcher Einträge hat, wird der Codeteil schnell umfangreich.
Deshalb meine Abkürzung. Statt z. B.
Code:
openpanel.add( new AbstractAction(){ /* ... */ } );
openpanel.add( new AbstractAction()
{
{
putValue( Action.NAME, "New with defaults" );
}
public void actionPerformed( final ActionEvent ev )
{
tasknewdefaults();
}
} );
ließe sich mit einer ordentlichen eigenen SubKlasse zumindest auf
Code:
openpanel.add( new ShortAction("New with defaults") {
public void action()
{
tasknewdefaults();
}
} );
kürzen, indem man einen Konstruktor einsetzt und die Standard-actionPerformed() die neue abstrakte Methode action() aufrufen läßt,
aber Reflection bietet natürlich noch mehr Einsparpotential
-----
@Der Müde Joe
> machs doch so wie oben vorgeschlagen..
Hmm, den Schreibaufwand, denn ich in meiner eigentlichen Klasse vermeiden möchte, lagere ich in weiteren Interfaces und Klassen aus ... Nette Idee, aber was habe ich dadurch gespart?
zu Der Müde Joe mag das stimmen, das meinst du vielleicht,
bei der ShortAction wäre der Vorteil, dass man die ShortAction nur einmal programmieren muss,
@SlaterB: Da kam dein Post, als ich gerade meine Entgegnung an Der Müde Joe anfertigte. Wenn Reflection noch mehr Einsparpotential bietet, wäre das ja meine Frage gewesen, wie ich das konkret machen muss.
das wurde schon in der allerersten Antwort beantwortet, bzw. deine Nachfragen in meiner ersten Antwort dann zurechtgewiesen
wenn du wirklich spezielle Probleme hast, dann frag ruhig,
aber dass du z.B. noch die invoke() Methode von Method brauchst kannst du nun wirklich überall nachlesen
@SlaterB: Es ist wohl in der ersten Antwort beantwortet worden, aber ich habs bisher nicht richtig umsetzen können. (Ist hier immerhin das Anfängerforum). Und ich teste dies immer eingebunden in meinem (kurzen) Code, weil ich die Erfahrung gemacht habe, dass sich viele Sachen plötzlich anders verhalten, wenn man alleinstehende (und funktionierende) Methoden in den Hauptcode aufnimmt (auch die Java-Doku ist nicht fehlerfrei) ...
Ich hab jetzt testweise folgendes versucht (Beispiel):
Code:
openpanel.add( new AbstractAction()
{
{
putValue( Action.NAME, "Open" );
}
public void actionPerformed( final ActionEvent ev )
{
showLine();
}
} );
Beim Klick auf den entsprechenden Eintrag des Panes kommt folgende Ausgabe (Auszug):
Code:
java.lang.NoSuchMethodException: de.package.GUI$8.showLine()
at java.lang.Class.getMethod(Unknown Source)
at de.package.GUI.GUI$8.actionPerformed(GUI.java:302)
Wieso kann Java die in der gleichen Klasse definierte Methode nicht finden?
Weil Sie nicht in der gleichen Klasse sitzt. Du definierst mit "new AbstractAction" eine neue (so called) anonyme Klasse welche das Interface AbstractAction implementiert.
weil der übergebene Paramer '(Class[])null' Quark ist,
wie du ihn in keinem funktionierenden Beispiel im Internet finden wirst,
oder auch in der API-Beschreibung zur Methode nachlesen kannst,
du musst ein leeres Class[] übergeben (Länge 0),
(edit: oder siehe vorherige Antwort, vielleicht geht sogar Array null..)
----
'Anfänger-Forum' sollte sich auf die Themen beziehen, nicht dass die Fragesteller selbstständiges Nachlesen einstellen können
aber das kann man so und so sehen, ich bleib jetzt mal hier meiner Argumentation treu, ohne dass nun allzu ernst zu sehen
import java.lang.reflect.Method;
public class Reflector {
public void foo() {
System.out.println("Hurra");
}
public static void main(String[] args) throws Exception {
Reflector ref = new Reflector();
Method meth = ref.getClass().getMethod("foo");
// mit referent auf das Objekt
meth.invoke(ref);
}
}