Typ einer inneren Klasse mit reflections finden

Mappenz

Bekanntes Mitglied
Hallo,


ich möchte gerne in einem JUnit test eine Instanz vom Typ
Code:
LinkedList<Pair>
erstellen. Pair ist eine innere Klasse von JFish:

Java:
public class JFish {
    private class Pair{
     ...
    }
...
}

Nun bin ich schon auf
Code:
JFish.class.getDeclaredClasses();
gekommen. Das funktioniert so aber noch nicht. Auch
Code:
Class Pair = JFish.class.getDeclaredClasses()[0].getClass();
oder ähnliche Konstrukte genügen nicht damit
Code:
LinkedList<Pair>
gültig ist.

Ist das überhaupt irgendwie machbar?
 
was genau funktioniert denn bitte daran nicht? Genauigkeit wäre so hilfreich..

JFish.class.getDeclaredClasses()[0] ist übrigens eine Klasse,
JFish.class.getDeclaredClasses()[0].getClass(); wird also nichts spannendes, sondern die Klasse Class liefern

übrigens:
Generics und Casten und jede Art von Typ-Variablen an sich sind in weiten Teilen mit Reflection unvereinbar,
für dein Ziel LinkedList<Pair> scheint der genannte Weg suspekt,
was soll denn wirklich herauskommen, was nützt dir eine LinkedList<Pair>?
 
Java:
public class JFishTest {

	private static JFish jFish = JFish.getInstance();
	private static Method get;
	private static Field pairsType;
	private static LinkedList<Object> pairs;
	
	@SuppressWarnings("unchecked")
	@org.junit.BeforeClass
	public static void beforeClass() throws SecurityException, NoSuchFieldException,
	IllegalArgumentException, IllegalAccessException, NoSuchMethodException {
		pairsType = JFish.class.getDeclaredField("pairs");
		pairsType.setAccessible(true);
		pairs = (LinkedList<Object>) pairsType.get(jFish);
		get = JFish.class.getDeclaredMethod("get", Integer.TYPE);
		get.setAccessible(true);
	}
	
	@Before
	public void before() {
		jFish.reset();
	}

	@Test
	public void multipleEqualRequestTest() throws InvalidIHandleException, 
	IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException {
		for(int i = 0; i < 10; i++) {
			get.invoke(jFish, 0x1);
		}
	}
}
Ich glaube du hast das Problem schon richtig verstanden und mir eben gesagt, dass es nichts wird. So sieht mein Test bis jetzt im wesentlichen aus. Das gibt auch keine Exceptions.
Code:
get(int)
in
Code:
JFish
verändert
Code:
LinkedList<Pair> pairs
aus JFish. Nun möchte ich mir in der Testklasse anschauen was mit pairs in einer JFish instanz passiert.

Dazu hätte habe ich mir gedacht ich mache eine
Code:
LinkedList<Pair>[code].
 
Nun möchte ich mir in der Testklasse anschauen was mit pairs in einer JFish instanz passiert.
Kannst du doch tun. Du hast die Liste ja schon in
Code:
private static LinkedList<Object> pairs;
.
Insofern verstehe ich nicht was das Problem ist.
Übrigens, da wir ja bei JFish sind, einige Sachen sehen ziemlich fishy aus.
-JFish.getInstance(), ein Pseudo-Singleton?

get(int) in JFish verändert LinkedList<Pair> pairs aus JFish
-Ein get das den Zustand ändert verstößt gegen das principal of least surprise

-Ein Test der fast ausschließlich mit Reflection arbeitet deutet nicht unbedingt auf testbaren Code hin und ist üblicherweise auch sehr wartungsintensiv.
 
get(int) in JFish verändert LinkedList<Pair> pairs aus JFish
-Ein get das den Zustand ändert verstößt gegen das principal of least surprise

Du hast Recht, aber da get ohnehin private bleiben sollte... naja das werde ich ändern.

JFish.getInstance(), ein Pseudo-Singleton?
Warum Pseudo-Singleton? Ich glaube dass JFish in der JVM die einzige Instanz ist. So sieht JFish etwa aus
Java:
public class JFish {
JFish jFish = new JFish();

  getInstance() {
    return jFish;
  }

}
Zwar habe ich Inzwischen ein bisschen umgebaut, aber die Lösung des Ursprünglichen Problems ist immernoch interessant.

Auf die LinkedList<Object> bin ich auch schon gekommen. Aber ich kann noch nicht in die Elemente der Liste sehen, weil Pair nicht sichtbar ist.
 
> (LinkedList<Object>)
es gibt keinen generischen Cast, das kann man schon als einen meiner aufgezählten Punkte nehmen,
für den Compiler wird nirgendwo auf der Welt in Java (LinkedList<Object>) irgendeinen Unterschied zu (LinkedList) haben,
das hat höchstens dokumentarische Zwecke

-----

wenn du LinkedList<Pair> haben willst, dann verwende das doch als Typ für deine Variable?
Reflection bzw. der Compiler kann dir dabei nicht helfen, der konkrete Typ ist ja unbekannt,
du kannst unsicher/unsave die Variable so deklarieren, vergleichbar mit einem Cast eines einzelnen Objektes,

wenn es letzlich nicht hinhaut, wird so oder so eine ClassCastException fliegen
 
wenn du LinkedList<Pair> haben willst, dann verwende das doch als Typ für deine Variable?
Das geht in dem Fall nicht, weil die Klasse private ist.
Also bleibt dir nur auf die Member von Pair ebenfalls mit Reflection zuzugreifen, oder die Sichtbarkeit zu erhöhen. Aber ehrlich, einen derart komplizierten und unleserlichen Test spart man sich lieber und investiert die Zeit ins Refactoring der zu testenden Klasse.
 

Zurück
Oben