public static Class<?>[] getParameterTypes(Invocation invocation) {
        if (($INVOKE.equals(invocation.getMethodName()) || $INVOKE_ASYNC.equals(invocation.getMethodName()))
                && invocation.getArguments() != null
                && invocation.getArguments().length > 1
                && invocation.getArguments()[1] instanceof String[]) {
            String[] types = (String[]) invocation.getArguments()[1];
            if (types == null) {
                return new Class<?>[0];
            }
            Class<?>[] parameterTypes = new Class<?>[types.length];
            for (int i = 0; i < types.length; i++) {
                parameterTypes[i] = ReflectUtils.forName(types[i]);
            }
            return parameterTypes;
        }
        return invocation.getParameterTypes();
    }
@Test
    void testGet_$invokeAsync_ParameterTypes() {
        Object[] args = new Object[] {"hello", true, 520};
        Class<?> demoServiceClass = DemoService.class;
        String serviceName = demoServiceClass.getName();
        Invoker invoker = createMockInvoker();

        RpcInvocation inv = new RpcInvocation(
                "$invokeAsync",
                serviceName,
                "",
                new Class<?>[] {String.class, String[].class, Object[].class},
                new Object[] {
                    "method", new String[] {"java.lang.String", "java.lang.Boolean", "java.lang.Integer"}, args
                },
                null,
                invoker,
                null);

        Class<?>[] parameterTypes = RpcUtils.getParameterTypes(inv);
        for (int i = 0; i < args.length; i++) {
            Assertions.assertNotNull(parameterTypes[i]);
            Assertions.assertEquals(args[i].getClass(), parameterTypes[i]);
        }
    }