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 testPojoGeneric4() throws NoSuchMethodException {
        String personName = "testName";

        Dgeneric generic = createDGenericPersonInfo(personName);
        Object o = JSON.toJSON(generic);
        {
            Dgeneric personInfo = (Dgeneric) PojoUtils.realize(o, Dgeneric.class);

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

            assertEquals(Dgeneric.NAME, personInfo.getName());

            assertEquals(personInfo.getT().getClass(), Ageneric.class);
            assertEquals(((Ageneric) personInfo.getT()).getData().getClass(), PersonInfo.class);
            assertEquals(personInfo.getY().getClass(), Bgeneric.class);
            assertEquals(((Bgeneric) personInfo.getY()).getData().getClass(), PersonInfo.class);
            assertEquals(personInfo.getZ().getClass(), Cgeneric.class);
            assertEquals(((Cgeneric) personInfo.getZ()).getData().getClass(), PersonInfo.class);

            assertEquals(personInfo.getZ().getClass(), Cgeneric.class);
            assertEquals(((Cgeneric) personInfo.getZ()).getA().getClass(), Ageneric.class);
            assertEquals(((Cgeneric) personInfo.getZ()).getA().getData().getClass(), PersonInfo.class);
            assertEquals(((Cgeneric) personInfo.getZ()).getB().getClass(), Bgeneric.class);
            assertEquals(((Cgeneric) personInfo.getZ()).getB().getData().getClass(), PersonInfo.class);
        }
    }