@aloxc
2017-12-05T06:24:28.000000Z
字数 921
阅读 424
一起学
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());
}