public static Object[] realize(Object[] objs, Class<?>[] types) {
        if (objs.length != types.length) {
            throw new IllegalArgumentException("args.length != types.length");
        }

        Object[] dests = new Object[objs.length];
        for (int i = 0; i < objs.length; i++) {
            dests[i] = realize(objs[i], types[i]);
        }

        return dests;
    }
@Test
    public void testPojoGeneric2() throws NoSuchMethodException {
        String personName = "testName";

        {
            Ageneric<Ageneric<PersonInfo>> generic2PersonInfo = createAGenericLoop(personName);
            Object o = JSON.toJSON(generic2PersonInfo);
            {
                Ageneric personInfo = (Ageneric) PojoUtils.realize(o, Ageneric.class);

                assertEquals(Ageneric.NAME, personInfo.getName());
                assertTrue(personInfo.getData() instanceof Map);
            }
            {
                Type[] createGenericPersonInfos = ReflectUtils.getReturnTypes(
                        PojoUtilsTest.class.getDeclaredMethod("createAGenericLoop", String.class));
                Ageneric personInfo = (Ageneric)
                        PojoUtils.realize(o, (Class) createGenericPersonInfos[0], createGenericPersonInfos[1]);

                assertEquals(Ageneric.NAME, personInfo.getName());
                assertEquals(personInfo.getData().getClass(), Ageneric.class);
                assertEquals(Ageneric.NAME, ((Ageneric) personInfo.getData()).getName());
                assertEquals(((Ageneric) personInfo.getData()).getData().getClass(), PersonInfo.class);
                assertEquals(personName, ((PersonInfo) ((Ageneric) personInfo.getData()).getData()).getName());
            }
        }
        {
            Bgeneric<Ageneric<PersonInfo>> generic = createBGenericWithAgeneric(personName);
            Object o = JSON.toJSON(generic);
            {
                Ageneric personInfo = (Ageneric) PojoUtils.realize(o, Ageneric.class);

                assertEquals(Bgeneric.NAME, personInfo.getName());
                assertTrue(personInfo.getData() instanceof Map);
            }
            {
                Type[] createGenericPersonInfos = ReflectUtils.getReturnTypes(
                        PojoUtilsTest.class.getDeclaredMethod("createBGenericWithAgeneric", String.class));
                Bgeneric personInfo = (Bgeneric)
                        PojoUtils.realize(o, (Class) createGenericPersonInfos[0], createGenericPersonInfos[1]);

                assertEquals(Bgeneric.NAME, personInfo.getName());
                assertEquals(personInfo.getData().getClass(), Ageneric.class);
                assertEquals(Ageneric.NAME, ((Ageneric) personInfo.getData()).getName());
                assertEquals(((Ageneric) personInfo.getData()).getData().getClass(), PersonInfo.class);
                assertEquals(personName, ((PersonInfo) ((Ageneric) personInfo.getData()).getData()).getName());
            }
        }
    }