Methodenname als Parameter

Status
Nicht offen für weitere Antworten.
O

obafmkm

Gast
Wie kann ich einen Parameter definieren, der eine Methode darstellt?

Ich möchte folgendes erreichen (das Beispiel belegt eine JXTaskPane mit einem Eintrag):
Code:
private AbstractAction getTaskAction( String name, String tip, ? methodenname )
{
	AbstractAction action = new AbstractAction()
		{
			private static final long serialVersionUID = 1L;
			{
				putValue( Action.NAME, name );
				putValue( Action.SHORT_DESCRIPTION, tip );
			}

			public void actionPerformed( ActionEvent e )
			{
				 methodenname();
			}
		};
	return action;
}
 
O

obafmkm

Gast
Aha, danke. Müsste es also heißen:
Code:
private AbstractAction getTaskAction( String name, String tip, String method )
{
	AbstractAction action = new AbstractAction()
		{
			{
				putValue( Action.NAME, name );
				putValue( Action.SHORT_DESCRIPTION, tip );
			}

			public void actionPerformed( ActionEvent e )
			{
				try
				{
					this.getClass().getMethod( method, null );
				}
				catch( SecurityException e )
				{
					e.printStackTrace();
				}
				catch( NoSuchMethodException e )
				{
					e.printStackTrace();
				}
			}
		};
	return action;
}
 
S

SlaterB

Gast
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
 

Schandro

Top Contributor
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();
		}
	}
 

ARadauer

Top Contributor
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 ;-)
 
O

obafmkm

Gast
Zum Sinn des Ganzen:

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(){ /* ... */ } );
bräuchte nur sowas stehen wie
Code:
openpanel.add( getTaskAction( "Open", "tooltip", "methode_open" );
openpanel.add( getTaskAction( "New", "tooltip", "methode_new" );
// usw.
Dann könnte die Methode getTaskAction() ungefähr so stehen (hier mal ohne Exception-Behandlung):
Code:
private AbstractAction getTaskAction( String name, String tip, String method )
{
   AbstractAction action = new AbstractAction()
      {
         {
            putValue( Action.NAME, name );
            putValue( Action.SHORT_DESCRIPTION, tip );
         }

         public void actionPerformed( ActionEvent e )
         {
               this.getClass().getMethod( method, null );
         }
      };
   return action;
}
Hintergrund ist also nur, einen umfangreichen Code zu kürzen, um ihn besser wartbar zu machen.
 

Der Müde Joe

Top Contributor
machs doch so wie oben vorgeschlagen..

Code:
private AbstractAction getTaskAction( String name, String tip, ActionCommand command )  {
//..
command.execute();
//..
}
public interface ActionCommand {
execute();
}

public PrintAction implements ActionCommand {

public execute() {
System.out.println("hello world)
}

}

//ausführen dann mit
asdf.getTaskAction("","",new PrintAction());

für jede Methode dann eine eigene Klasse

EDIT:
Reflection ist nicht grad das einfachste und Methode müssete man mit invoke ausführen
 
S

SlaterB

Gast
nebenbei:

Code:
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..

das ist doch alles längst bekannt?
 
O

obafmkm

Gast
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?
 
S

SlaterB

Gast
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,
 
O

obafmkm

Gast
@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.
 
S

SlaterB

Gast
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
 
O

obafmkm

Gast
@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();
      }
   } );
hab ich ersetzt durch
Code:
openpanel.add( getTaskAction( "name", "tooltip", "showLine" ) );
getTaskAction() ist wie folgt (hier ohne Exceptions):
Code:
private AbstractAction getTaskAction( final String name, final String tip, final String method )
{
	AbstractAction action = new AbstractAction()
		{
			{
				putValue( Action.NAME, name );
				putValue( Action.SHORT_DESCRIPTION, tip );
			}

			public void actionPerformed( ActionEvent e )
			{
					this.getClass().getMethod( method, (Class[])null ).invoke( method, (Object[])null );
			}
		};
}
Dazu kommt noch die showLine() (mit Testinhalt):
Code:
protected void showLine()
{
	System.out.println( "HURRA" );
}
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?
 

Noctarius

Top Contributor
Weil Sie nicht in der gleichen Klasse sitzt. Du definierst mit "new AbstractAction" eine neue (so called) anonyme Klasse welche das Interface AbstractAction implementiert.
 
S

SlaterB

Gast
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
 

Der Müde Joe

Top Contributor
Als kleines Beispiel:
Code:
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);
	}
}
 

Noctarius

Top Contributor
Code:
this.getClass().getMethod( method, new Class[0] ).invoke( this.getClass(), new Object[0] );
 

Der Müde Joe

Top Contributor
Noctarius hat gesagt.:
Code:
this.getClass().getMethod( method, new Class[0] ).invoke( this.getClass(), new Object[0] );

so ... Zeugs kann man weglassen und this.getClass will nicht die Klasse, sondern das Objekt..also this

EDIT:
bei this.getClass() meine ich invoke will das Objekt und nicht die Klasse vom Objekt
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Methodenname aus variable Java Basics - Anfänger-Themen 2
T Methoden Variable als Methodenname Java Basics - Anfänger-Themen 10
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
BeginnerJava "Weihnachtsbäume" anzeigen: Höhe als Parameter Java Basics - Anfänger-Themen 1
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
X Default Parameter Java Basics - Anfänger-Themen 20
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
J Bestimmte parameter aus Jsonfile auslesen Java Basics - Anfänger-Themen 15
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
J Apache Poi - createCell() Methode akzeptiert keinen Index aus for-schleife als Parameter Java Basics - Anfänger-Themen 4
P Parameter auf Datenformat überprüfen Java Basics - Anfänger-Themen 5
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
W Parameter solange addieren bis 13 auftaucht Java Basics - Anfänger-Themen 11
L OOP Parameter mit der Draw-Methode übergeben Java Basics - Anfänger-Themen 11
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
L Methoden Übergabe von Parameter Java Basics - Anfänger-Themen 3
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
V Unbekannte Parameter Java Basics - Anfänger-Themen 1
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
A festgelegte Parameter Java Basics - Anfänger-Themen 11
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
D Interface Final für Parameter in überschriebenen Methoden? Java Basics - Anfänger-Themen 3
P Variablen Optionaler Parameter auf der Kommandozeile Java Basics - Anfänger-Themen 12
S Variable Parameter Java Basics - Anfänger-Themen 5
L Variablen Parameter bekommen Java Basics - Anfänger-Themen 13
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
K Klassenmethode mit übergebenen Parameter speichern Java Basics - Anfänger-Themen 7
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
J Programm was üer Runtime.getRuntime gestartet wird erkennt String Parameter nicht Java Basics - Anfänger-Themen 0
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Parameter das übergeben wurde ändern? Java Basics - Anfänger-Themen 1
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
D Name eines JMenue als Parameter übergeben Java Basics - Anfänger-Themen 20
K Dynamischen Supplier für Parameter Java Basics - Anfänger-Themen 12
C Methoden Welche JSoup Methoden Und Parameter für diese HTML Tags Java Basics - Anfänger-Themen 4
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
M Methode mit Parameter Java Basics - Anfänger-Themen 4
G Objektübergabe durch Parameter Java Basics - Anfänger-Themen 3
J Erste Schritte catch Exeption Parameter Java Basics - Anfänger-Themen 7
A Erste Schritte Methoden mit Parameter Java Basics - Anfänger-Themen 2
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
N Klassen Klassen zwingende Parameter mitteilen Java Basics - Anfänger-Themen 4
L Methoden Methode Parameter vertauschen? Java Basics - Anfänger-Themen 3
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
A Methoden Parameter optionalisieren möglich? - Wie? Java Basics - Anfänger-Themen 19
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
F Methoden: Referenzvariable als Parameter Java Basics - Anfänger-Themen 4
J HttpGet Parameter mitgeben Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
T Klasse von erfahren wenn Obertyp Parameter ist Java Basics - Anfänger-Themen 6
J Klassen Fehler mit Parameter des Konstruktors bei einer Objekterzeugung Java Basics - Anfänger-Themen 5
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Klasse als Parameter übergeben Java Basics - Anfänger-Themen 7
S Methoden eine Instanz einer eigenen Klasse als parameter übergeben Java Basics - Anfänger-Themen 9
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
V Methoden key value Parameter Java Basics - Anfänger-Themen 11
J Drucker parameter ändern Java Basics - Anfänger-Themen 9
F trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 0
O Basisklassen als Methoden-Parameter ähnlich, wie in C++ ? Java Basics - Anfänger-Themen 6
D GregorianCalendar als Parameter Java Basics - Anfänger-Themen 2
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
T In main-Methode Parameter übergeben Java Basics - Anfänger-Themen 3
M Methode als Parameter übergeben Java Basics - Anfänger-Themen 16
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12
T Parameter in Eigner Konsole Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben