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

        Cgeneric<PersonInfo> generic = createCGenericPersonInfo(personName);
        Object o = JSON.toJSON(generic);
        {
            Cgeneric personInfo = (Cgeneric) PojoUtils.realize(o, Cgeneric.class);

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

            assertEquals(Cgeneric.NAME, personInfo.getName());
            assertEquals(personInfo.getData().getClass(), PersonInfo.class);
            assertEquals(personName, ((PersonInfo) personInfo.getData()).getName());

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