package com.github.wangxuehui.rpc.snrpc.util; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; /** * @author skyim E-mail:wxh64788665@gmail.com * 类说明 */ public class ReflectionCache { private static final Map<String, Class<?>> PRIMITIVE_CLASS = new HashMap<String, Class<?>>(); private static final LRUMap<String, Class<?>> CLASS_CACHE = new LRUMap<String, Class<?>>( 128); private static final LRUMap<String, Method> METHOD_CACHE = new LRUMap<String, Method>( 1024); static { PRIMITIVE_CLASS.put("boolean", boolean.class); PRIMITIVE_CLASS.put("byte", byte.class); PRIMITIVE_CLASS.put("short", short.class); PRIMITIVE_CLASS.put("int", int.class); PRIMITIVE_CLASS.put("long", long.class); PRIMITIVE_CLASS.put("long", long.class); PRIMITIVE_CLASS.put("float", float.class); PRIMITIVE_CLASS.put("double", double.class); PRIMITIVE_CLASS.put("void", void.class); CLASS_CACHE.putAll(PRIMITIVE_CLASS); } public static Class<?> getClass(String className) throws ClassNotFoundException { Class<?> clazz = CLASS_CACHE.get(className); if (null != clazz) { return clazz; } synchronized (CLASS_CACHE) { if (null == CLASS_CACHE.get(className)) { clazz = PRIMITIVE_CLASS.get(className); if (null == clazz) { clazz = Class.forName(className); } CLASS_CACHE.put(className, clazz); return clazz; } else { return CLASS_CACHE.get(className); } } } public static Method getMethod(String className, String methodName, String[] parameterTypes) throws ClassNotFoundException, SecurityException, NoSuchMethodException { String key = className + "-" + methodName + "-" + join(parameterTypes, ";"); Method method = METHOD_CACHE.get(key); if (null != method) { return method; } synchronized (METHOD_CACHE) { if (null == METHOD_CACHE.get(key)) { Class<?> clazz = getClass(className); Class<?>[] parameterClasses = new Class<?>[parameterTypes.length]; for (int i = 0; i < parameterClasses.length; i++) { parameterClasses[i] = getClass(parameterTypes[i]); } method = clazz.getMethod(methodName, parameterClasses); METHOD_CACHE.put(key, method); return method; } else { return METHOD_CACHE.get(key); } } } private static String join(String[] strs, String seperator) { if (null == strs || 0 == strs.length) { return ""; } StringBuilder sb = new StringBuilder(1024); sb.append(strs[0]); for (int i = 1; i < strs.length; i++) { sb.append(seperator).append(strs[i]); } return sb.toString(); } }