@aloxc
2017-12-05T06:24:28.000000Z
字数 921
阅读 488
一起学 ignite 源码分析
如题,ignite中对缓存操作的时候可选是否需要对缓存的key进行检查,这个可由环境变量IGNITE_CACHE_KEY_VALIDATION_DISABLED来控制,配置false或者不配置就表示需要对key进行验证,true就表示不需要进行验证,该字段在IgniteSystemProperties.java中定义。
如果平常编码严格的话可配置,线上环境可配置为false。
当需要验证的时候,是通过反射读取作为key的对象实现类中有无覆盖hashCode和equals方法,代码见
IgniteUtils.java中
public static boolean overridesEqualsAndHashCode(Object obj) {try {Class<?> cls = obj.getClass();return !Object.class.equals(cls.getMethod("equals", Object.class).getDeclaringClass()) &&!Object.class.equals(cls.getMethod("hashCode").getDeclaringClass());}catch (NoSuchMethodException | SecurityException ignore) {return true; // Ignore.}}
调用该代码的是GridCacheUtils.java中的public static void validateCacheKey(@Nullable Object key)
public static void validateCacheKey(@Nullable Object key) {if (key == null)return;if (!IgniteUtils.overridesEqualsAndHashCode(key))throw new IllegalArgumentException("Cache key must override hashCode() and equals() methods: " +key.getClass().getName());}

