Use our own hashing architecture, take 2 (#2817)This replaces Guava's hashing. We need this for two reasons:- it allows the addition of custom hash functions, like BLAKE2b which would not be possible with Guava's closed design- it fixes a few performance issues that Guava only fixes in version 20 (which we can't upgrade to right now, because we still need to support Java 5 in places)
Rework the reflection cacheThe reflection cache is now safer, because we use a hierarchical cache wherethe node entries are weakly referenced `Class` instances. Typically the firstlevel of the cache would be the receiver, while lower levels would be theargument types. If those types are collected, the weak hash maps that we useinternally would automatically clean the entries. Eventually, the value associatedwith this "path" of `Class` itself references a `Method` or a `Constructor`with additional, computed, data.The advantage of this approach is that typically for the instantiator case,we no longer need to match the argument types (`isMatch`) for each call: instead,we go through the tree using subsequent argument types, and if a match is found,we know it's the right one.
Allow JMH testing in all projectsUntil now, JMH benchmarks went into the `performance` project,regardless of what part of the code base they were testing.This change allows every project to use a jmh source set to forbenchmarks of its own classes.