Methodenaufrufe von Anonymen Klassen

Alibi086

Mitglied
Hallo nochmal !

Habe ich eigentlich auch bei der Verwendung von anonymen Klassen in Java die Möglichkeit Methoden wie getter, setter und andere individuelle Methoden aufzurufen, die diese Klasse möglicherweise implementiert hat (unabhängig davon, ob es fachlich einen Sinn machen würde, sondern eher aus dem technischen Blickwinkel betrachtet)?

Ich frage deshalb, weil ich ja keine Referenzvariable nutze, um mit dieser Klasse und dem instanziierten Objekt zu kommmunizieren.

Danke für die Hilfe!

Gruß
Felix
 
Das Problem ist weniger die fehlende Referenz, das kann man ja noch hinschreiben. Das Problem ist vielmehr dass es keinen Typ gibt auf den man casten könnte:

Java:
public class Test
{
	public static void main(String[] args) throws Exception
	{
		Comparator<String> anonym = new Comparator<String>()
		{
			private boolean reverse;
			
			public void setReverse(boolean reverse)
			{
				this.reverse = reverse;
			}
			
			@Override
			public int compare(String o1, String o2)
			{
				if(reverse)
					return o1.compareTo(o2);
				else
					return o2.compareTo(o1);
			}
		};
		
		String a = "a";
		String b = "b";
		
		System.out.println(anonym.compare(a, b));
		
		//anonym.setReverse(true); geht nicht da anonym vom Typ Comparator ist.
		
		//Per Reflection kommt man dran
		Class<? extends Comparator> clazz = anonym.getClass();
		Method setReverse = clazz.getDeclaredMethod("setReverse", Boolean.TYPE);
		setReverse.invoke(anonym, true);
		
		System.out.println(anonym.compare(a, b));
	}
}

Zwar gibt es einen Typ innerhalb der VM, dieser heißt in diesem Fall Test$1, daher funktioniert das per Reflection, aber auf Test$1 kann nicht gecastet werden. Das ganze per Reflection zu machen geht zwar ist aber richtig häßlich.
 
Also es ist extrem unsauber das mit Reflection zu lösen.
Aber toller Lerneffekt... :-D

Mach einfach eine private Klasse MyComparator und schon kommst Du an Dein setReverse.

Das versteht dann auch jemand der sich mit Reflection nicht auskennt...
 
Schon klar, aber das Thema geht um anonyme Klassen und ob man Methoden der anonymen Klasse aufrufen kann. Antwort nein es geht nicht, außer man nutzt Reflection.
 
Nachtrag:

mach Dir einen abstrakten ReversableComparator, der reverse getted/setted, eine compareElements - Methode fordert und selbst dann compare mit der Reverse- Mimik überlädt, der geht dann für alles.

Java:
public abstract class ReversablComparator<T> extends Comparator<T> {

    private boolean reverse;

    public boolean isReverse() {
        return reverse;
    }

    public boolean setReverse( boolean reverse ) {
        this.reverse = reverse;
    }

    public abstract int compareElements( T obj1, T obj2 );

    @Override
    public int compare (T o1, T o2 ) {
        
        if (isReverse()) {
            return compareElements( o2, o1 );
        } else {
            return compareElements( o1, o2 );
        }
    }
}

Wenn Du die implementierst, geht alles so , wie Du willst, und die compareElements braucht auch das reverse nicht zu implementieren.
 

Zurück
Oben