/** * {@inheritDoc} */ @Override public Object invoke(MethodInvocation invocation) throws Throwable { Method method = invocation.getMethod(); if (method.getDeclaringClass() == Object.class && method.getName().equals("toString")) { return proxyObject.getClass().getName() + "@" + System.identityHashCode(proxyObject); } Type retType = (invocation.getMethod().getGenericReturnType() != null) ? invocation.getMethod().getGenericReturnType() : invocation.getMethod().getReturnType(); Object arguments = ReflectionUtil.parseArguments(invocation.getMethod(), invocation.getArguments()); return jsonRpcRestClient.invoke(invocation.getMethod().getName(), arguments, retType, extraHttpHeaders); }
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (isDeclaringClassAnObject(method)) return proxyObjectMethods(method, proxy, args); final Object arguments = ReflectionUtil.parseArguments(method, args); final String methodName = getMethodName(method); return client.invokeAndReadResponse(methodName, arguments, method.getGenericReturnType(), output, input); } });
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (isDeclaringClassAnObject(method)) return proxyObjectMethods(method, proxy, args); final Object arguments = ReflectionUtil.parseArguments(method, args); final String methodName = getMethodName(method); return client.invoke(methodName, arguments, method.getGenericReturnType(), extraHeaders); } });
/** * {@inheritDoc} */ @Override public Object invoke(MethodInvocation invocation) throws Throwable { Method method = invocation.getMethod(); if (method.getDeclaringClass() == Object.class && method.getName().equals("toString")) { return proxyObject.getClass().getName() + "@" + System.identityHashCode(proxyObject); } Type retType = (invocation.getMethod().getGenericReturnType() != null) ? invocation.getMethod().getGenericReturnType() : invocation.getMethod().getReturnType(); Object arguments = ReflectionUtil.parseArguments(invocation.getMethod(), invocation.getArguments()); return jsonRpcHttpClient.invoke(invocation.getMethod().getName(), arguments, retType, extraHttpHeaders); }
@Test(expected = RuntimeException.class) public void noNamedParamsPassParamsObject() throws Exception { Object[] arguments = {"1", 2}; ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("noNamedParamsPassParamsObject", String.class, int.class), arguments); }
@Test(expected = RuntimeException.class) public void someNamedParams() throws Exception { ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("someNamedParams", String.class, int.class), null); }
@Test(expected = RuntimeException.class) public void someNamedParamsPassParamsAuto() throws Exception { ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("someNamedParamsPassParamsAuto", String.class, int.class), null); }
@Test(expected = RuntimeException.class) public void someNamedParamsPassParamsArray() throws Exception { ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("someNamedParamsPassParamsArray", String.class, int.class), null); }
@Test(expected = RuntimeException.class) public void someNamedParamsPassParamsObject() throws Exception { ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("someNamedParamsPassParamsObject", String.class, int.class), null); }
@Test public void noParams() throws Exception { assertEquals(0, ((Object[]) ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("noParams"), null)).length); Object[] arguments = new Object[0]; assertSame(arguments, ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("noParams"), arguments)); }
@Test public void noNamedParamsPassParamsArray() throws Exception { Object[] arguments = {"1", 2}; assertSame(arguments, ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("noNamedParamsPassParamsArray", String.class, int.class), arguments)); }
@Test public void noNamedParamsPassParamsAuto() throws Exception { Object[] arguments = {"1", 2}; assertSame(arguments, ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("noNamedParamsPassParamsAuto", String.class, int.class), arguments)); }
@Test public void noNamedParams() throws Exception { Object[] arguments = {"1", 2}; assertSame(arguments, ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("noNamedParams", String.class, int.class), arguments)); }
@Test public void allNamedParams() throws Exception { Object[] arguments = {"1", 2}; @SuppressWarnings("unchecked") Map<String, Object> namedParams = (Map<String, Object>) ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("allNamedParams", String.class, int.class), arguments); assertEquals(2, namedParams.size()); assertEquals("1", namedParams.get("one")); assertEquals(2, namedParams.get("two")); }
@Test public void allNamedParamsPassParamsObject() throws Exception { Object[] arguments = {"1", 2}; @SuppressWarnings("unchecked") Map<String, Object> namedParams = (Map<String, Object>) ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("allNamedParamsPassParamsAuto", String.class, int.class), arguments); assertEquals(2, namedParams.size()); assertEquals("1", namedParams.get("one")); assertEquals(2, namedParams.get("two")); }
@Test public void allNamedParamsPassParamsAuto() throws Exception { Object[] arguments = {"1", 2}; @SuppressWarnings("unchecked") Map<String, Object> namedParams = (Map<String, Object>) ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("allNamedParamsPassParamsAuto", String.class, int.class), arguments); assertEquals(2, namedParams.size()); assertEquals("1", namedParams.get("one")); assertEquals(2, namedParams.get("two")); }
@Test public void allNamedParamsPassParamsArray() throws Exception { Object[] arguments = {"1", 2}; Object[] params = (Object[]) ReflectionUtil.parseArguments(JsonRpcTestService.class.getMethod("allNamedParamsPassParamsArray", String.class, int.class), arguments); assertEquals(2, params.length); assertEquals("1", params[0]); assertEquals(2, params[1]); }
@SuppressWarnings("unchecked") private static <T> T createClientProxy(ClassLoader classLoader, Class<T> proxyInterface, final IJsonRpcClient client, final Map<String, String> extraHeaders) { System.out.println("### Create proxy"); return (T) Proxy.newProxyInstance(classLoader, new Class<?>[]{proxyInterface}, (Object proxy, Method method, Object[] args) -> { if (isDeclaringClassAnObject(method)) { System.out.println("### Class is an object"); return proxyObjectMethods(method, proxy, args); } // Convert parameters final Parameter[] parameters = method.getParameters(); for (int i = 0; i < parameters.length; i++) { final Parameter param = parameters[i]; if (param.isAnnotationPresent(Convert.class)) { System.out.println("### Convert parameter " + param.getName()); final Convert convert = param.getAnnotation(Convert.class); final Converter converter = convert.value().newInstance(); args[i] = converter.marshal(args[i]); } } final Object arguments = ReflectionUtil.parseArguments(method, args); final String methodName = getMethodName(method); if (method.isAnnotationPresent(Convert.class)) { final Convert convert = method.getAnnotation(Convert.class); final Converter converter = convert.value().newInstance(); return converter.unmarshal(client.invoke(methodName, arguments, Object.class, extraHeaders)); } return client.invoke(methodName, arguments, method.getGenericReturnType(), extraHeaders); }); }