Spring bean reflection

This commit is contained in:
crusader 2017-07-05 17:19:28 +09:00
parent 0ed1fee60f
commit 22c47f850d
3 changed files with 34 additions and 143 deletions

View File

@ -1,6 +1,5 @@
package com.loafle.overflow.proxy;
import com.google.gson.internal.Primitives;
import com.google.protobuf.ByteString;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
@ -10,7 +9,6 @@ import org.springframework.stereotype.Component;
import java.io.IOException;
import java.lang.reflect.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -27,23 +25,6 @@ public class ServiceInvoker {
private Map<String, Cache> serviceCacheMap;
private static final Map<String, Class> primitiveMap;
static {
Map<String, Class> primitives = new HashMap<>(8);
primitives.put("boolean", boolean.class);
primitives.put("byte", byte.class);
primitives.put("char", char.class);
primitives.put("double", double.class);
primitives.put("float", float.class);
primitives.put("int", int.class);
primitives.put("long", long.class);
primitives.put("short", short.class);
primitiveMap = Collections.unmodifiableMap(primitives);
}
public ServiceInvoker(ApplicationContext context) {
this.context = context;
objectMapper = new ObjectMapper();
@ -88,40 +69,7 @@ public class ServiceInvoker {
return methodCache;
}
methodCache.parameterCaches = new ParameterCache[paramCount];
ParameterCache parameterCache = null;
Type[] parameterTypes = method.getGenericParameterTypes();
Type parameterType = null;
ParameterizedType parameterizedType = null;
Type[] actualTypeArguments = null;
for (int i = 0; i < paramCount; i++) {
parameterCache = new ParameterCache();
methodCache.parameterCaches[i] = parameterCache;
parameterType = parameterTypes[i];
if (parameterType instanceof ParameterizedType) {
parameterizedType = (ParameterizedType)parameterType;
parameterCache.clazz = Class.forName(parameterizedType.getRawType().getTypeName());
actualTypeArguments = parameterizedType.getActualTypeArguments();
if (null != actualTypeArguments && 0 < actualTypeArguments.length) {
parameterCache.genericClazzes = new Class<?>[actualTypeArguments.length];
for (int j = 0; j < actualTypeArguments.length; j++) {
parameterCache.genericClazzes[j] = Class.forName(actualTypeArguments[j].getTypeName());
}
}
} else {
if (Primitives.isPrimitive(parameterType)) {
parameterCache.clazz = primitiveMap.get(parameterType.getTypeName());
} else {
parameterCache.clazz = Class.forName(parameterType.getTypeName());
}
}
}
methodCache.parameterTypes = method.getGenericParameterTypes();
return methodCache;
}
@ -147,11 +95,7 @@ public class ServiceInvoker {
private static class MethodCache {
private Method method;
private Class returnClazz;
private ParameterCache[] parameterCaches;
}
private static class ParameterCache {
private Class clazz;
private Class[] genericClazzes;
private Type[] parameterTypes;
}
}
@ -166,88 +110,37 @@ public class ServiceInvoker {
return serviceCache;
}
private Object getValue(Cache.ParameterCache parameterCache, String json) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Object result = null;
if (List.class == parameterCache.clazz) {
if (null == parameterCache.genericClazzes || 1 != parameterCache.genericClazzes.length) {
throw new IllegalArgumentException();
}
result = objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, parameterCache.genericClazzes[0]));
} else if (Map.class == parameterCache.clazz) {
if (null == parameterCache.genericClazzes || 2 != parameterCache.genericClazzes.length) {
throw new IllegalArgumentException();
}
result = objectMapper.readValue(json, objectMapper.getTypeFactory().constructMapType(Map.class, parameterCache.genericClazzes[0], parameterCache.genericClazzes[1]));
} else if (parameterCache.clazz.isPrimitive()) {
Class wrapperClazz = Primitives.wrap(parameterCache.clazz);
Constructor con = wrapperClazz.getConstructor(String.class);
result = con.newInstance(json);
} else {
result = objectMapper.readValue(json, parameterCache.clazz);
}
return result;
private Object getValue(Type parameterType, String json) throws IOException {
return objectMapper.readValue(json, objectMapper.getTypeFactory().constructType(parameterType));
}
private Object[] getParameters(Cache.ParameterCache[] parameterCaches, List<String> params) throws IOException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
if (null == parameterCaches || null == params) {
private Object[] getParameters(Type[] parameterTypes, List<ByteString> params) throws IOException {
if (null == parameterTypes || null == params) {
return null;
}
if (parameterCaches.length != params.size()) {
if (parameterTypes.length != params.size()) {
throw new IllegalArgumentException();
}
Object[] result = new Object[parameterCaches.length];
Object[] result = new Object[parameterTypes.length];
for (int i = 0; i < parameterCaches.length; i++) {
result[i] = getValue(parameterCaches[i], params.get(i));
for (int i = 0; i < parameterTypes.length; i++) {
result[i] = getValue(parameterTypes[i], params.get(i).toStringUtf8());
}
return result;
}
private Object[] getParametersForByteString(Cache.ParameterCache[] parameterCaches, List<ByteString> params) throws IOException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
if (null == parameterCaches || null == params) {
return null;
}
if (parameterCaches.length != params.size()) {
throw new IllegalArgumentException();
}
Object[] result = new Object[parameterCaches.length];
for (int i = 0; i < parameterCaches.length; i++) {
result[i] = getValue(parameterCaches[i], params.get(i).toStringUtf8());
}
return result;
}
public String invoke(String serviceName, String methodName, List<String> params) throws NoSuchMethodException, ClassNotFoundException, IOException, InvocationTargetException, IllegalAccessException, InstantiationException {
public String invoke(String serviceName, String methodName, List<ByteString> params) throws NoSuchMethodException, ClassNotFoundException, IOException, InvocationTargetException, IllegalAccessException {
Cache serviceCache = getServiceCache(serviceName);
Cache.MethodCache methodCache = serviceCache.getMethodCache(methodName);
Object[] parameters = null;
if (null != methodCache.parameterCaches && 0 < methodCache.parameterCaches.length) {
parameters = getParameters(methodCache.parameterCaches, params);
}
Object result = methodCache.method.invoke(serviceCache.getBean(), parameters);
String jsonInString = objectMapper.writeValueAsString(result);
return jsonInString;
}
public String invokeForByteString(String serviceName, String methodName, List<ByteString> params) throws NoSuchMethodException, ClassNotFoundException, IOException, InvocationTargetException, IllegalAccessException, InstantiationException {
Cache serviceCache = getServiceCache(serviceName);
Cache.MethodCache methodCache = serviceCache.getMethodCache(methodName);
Object[] parameters = null;
if (null != methodCache.parameterCaches && 0 < methodCache.parameterCaches.length) {
parameters = getParametersForByteString(methodCache.parameterCaches, params);
if (null != methodCache.parameterTypes && 0 < methodCache.parameterTypes.length) {
parameters = getParameters(methodCache.parameterTypes, params);
}
Object result = methodCache.method.invoke(serviceCache.getBean(), parameters);

View File

@ -66,7 +66,7 @@ public class ServiceProxy {
String result = null;
try {
result =this.serviceInvoker.invokeForByteString(request.getTarget(), request.getMethod(), request.getParamsList().asByteStringList());
result =this.serviceInvoker.invoke(request.getTarget(), request.getMethod(), request.getParamsList().asByteStringList());
ServerOutput reply = ServerOutput.newBuilder()
.setResult(result)
@ -88,9 +88,6 @@ public class ServiceProxy {
} catch (IllegalAccessException e) {
e.printStackTrace();
responseObserver.onError(e);
} catch (InstantiationException e) {
e.printStackTrace();
responseObserver.onError(e);
}

View File

@ -1,6 +1,7 @@
package com.loafle.overflow.proxy;
import com.google.common.primitives.Primitives;
import com.google.protobuf.ByteString;
import com.loafle.overflow.module.target.service.TargetDiscoveryService;
import com.loafle.overflow.spring.AppConfig;
import com.loafle.overflow.spring.JdbcConfiguration;
@ -29,27 +30,27 @@ public class ServiceInvokerTest {
@Test
public void invoke() throws Exception {
// List<String> params = new ArrayList<>(2);
// params.add("[{\"id\": 1," +
// "\"ip\":2312132112," +
// "\"mac\":12312312," +
// "\"os\": \"Windows\"," +
// "\"target\":true}]");
// params.add("{\"id\": 1," +
// "\"ip\":2312132112," +
// "\"probeKey\":\"sdfsdfsdfsdfsd\"}");
//
// serviceInvoker.invoke("TargetDiscoveryService", "saveAllTarget", params);
List<ByteString> params = new ArrayList<>(2);
params.add(ByteString.copyFromUtf8("[{\"id\": 1," +
"\"ip\":2312132112," +
"\"mac\":12312312," +
"\"os\": \"Windows\"," +
"\"target\":true}]"));
params.add(ByteString.copyFromUtf8("{\"id\": 1," +
"\"ip\":2312132112," +
"\"probeKey\":\"sdfsdfsdfsdfsd\"}"));
// List<String> params = new ArrayList<>(1);
// params.add("1");
//
// serviceInvoker.invoke("InfraOSService", "read", params);
serviceInvoker.invoke("TargetDiscoveryService", "saveAllTarget", params);
List<String> params = new ArrayList<>(1);
params.add("1");
List<ByteString> params2 = new ArrayList<>(1);
params2.add(ByteString.copyFromUtf8("1"));
serviceInvoker.invoke("MemberService", "read", params);
serviceInvoker.invoke("InfraOSService", "read", params2);
List<ByteString> params3 = new ArrayList<>(1);
params3.add(ByteString.copyFromUtf8("1"));
serviceInvoker.invoke("MemberService", "read", params3);
}