public static byte[] generateCallStubV(Class<?> clazz, Method method) {
        final AggBatchCallGenerator generator = new AggBatchCallGenerator(clazz, method);
        generator.declareCallStubClazz();
        generator.genBatchUpdateSingle();
        generator.finish();
        return generator.getByteCode();
    }
@Test
    public void testAggCallSingleStubWithMultiParameters()
            throws NoSuchMethodException, ClassNotFoundException, InvocationTargetException, IllegalAccessException {
        Class<?> clazz = SumStringConcat.class;
        final String genClassName = CallStubGenerator.CLAZZ_NAME.replace("/", ".");
        Method m = clazz.getMethod("update", SumStringConcat.State.class, String.class, Integer.class);
        final byte[] updates =
                CallStubGenerator.generateCallStubV(clazz, m);

        ClassLoader classLoader = new TestClassLoader(genClassName, updates);
        final Class<?> stubClazz = classLoader.loadClass(genClassName);
        Method batchCall = getFirstMethod(stubClazz, "batchCallV");

        SumStringConcat concat = new SumStringConcat();
        SumStringConcat.State state = new SumStringConcat.State();

        int testSize = 1000;
        String expect = "";

        String[] inputs1 = new String[testSize];
        Integer[] inputs2 = new Integer[testSize];

        for (int i = 0; i < testSize; i++) {
            inputs1[i] = i + "";
            inputs2[i] = i;
            expect += inputs1[i] + inputs2[i];
        }

        batchCall.invoke(null, testSize, concat, state, inputs1, inputs2);
        Assertions.assertEquals(expect, state.val);
    }