@Test public void firstTest() throws NoSuchFieldException { Generic generic = new Generic(AnotherWrapper.class); Assert.assertEquals(AnotherWrapper.class.getSimpleName(), generic.toString()); Assert.assertEquals(AnotherWrapper.class, generic.clazz); Assert.assertEquals(ListWrapper.class, generic.parent.clazz); Assert.assertEquals(Wrapper.class, generic.parent.parent.clazz); Assert.assertEquals(Object.class, generic.parent.parent.parent.clazz); Assert.assertEquals(null, generic.parent.parent.parent.parent); Generic type = generic.getGenericType(Wrapper.class.getDeclaredField("value")); Assert.assertEquals(List.class, type.clazz); Assert.assertEquals(Wrapper.class, type.typeParameters[0].clazz); Assert.assertEquals(String.class, type.typeParameters[0].typeParameters[0].clazz); }