Хэш-код объекта не должен быть уникальным.
правило проверки:
Equals
метод. Все, что Вы хотите, GetHashCode
алгоритм, который разделяет Ваш набор на примерно даже группы - это не должно формировать ключ, поскольку HashTable
или Dictionary<>
должен будет использовать хеш для оптимизации извлечения.
, Сколько времени Вы ожидаете, что данные будут? Как случайный? Если длины варьируются значительно (скажите для файлов), тогда просто возвратите длину. Если длины, вероятно, будут подобным взглядом на подмножество байтов, которое варьируется.
GetHashCode
должно быть намного более быстрым, чем Equals
, но не должен быть уникальным.
Две идентичных вещи никогда не должны иметь различные хэш-коды. Два различных объекта не должны иметь тот же хэш-код, но некоторые коллизии должны ожидаться (в конце концов, существует больше перестановок, чем возможные целые числа на 32 бита).
Method method = getClass().getDeclaredMethod("methodName");
m.invoke(obj);
Это на случай, если у метода нет аргументов. Если да, добавьте типы аргументов в качестве аргументов этого метода.
obj
- это объект, для которого вы вызываете метод.
Чисто отражение: Method.invoke . Другое решение состоит в том, чтобы потребовать от элемента, который вы создаете рефлексивно, реализовать известный интерфейс, преобразовать его в этот интерфейс и использовать как обычно.
Последний обычно используется для «плагинов», первый не используется очень часто.
Вы можете начать с чтения об этом здесь .
Что касается код, который вы используете после этого (из того же ресурса):
Method[] allMethods = c.getDeclaredMethods();
for (Method m : allMethods) {
String mname = m.getName();
if (!mname.startsWith("test")
|| (m.getGenericReturnType() != boolean.class)) {
continue;
}
Type[] pType = m.getGenericParameterTypes();
if ((pType.length != 1)
|| Locale.class.isAssignableFrom(pType[0].getClass())) {
continue;
}
out.format("invoking %s()%n", mname);
try {
m.setAccessible(true);
Object o = m.invoke(t, new Locale(args[1], args[2], args[3]));
out.format("%s() returned %b%n", mname, (Boolean) o);
// Handle any exceptions thrown by method to be invoked.
} catch (InvocationTargetException x) {
Throwable cause = x.getCause();
err.format("invocation of %s failed: %s%n",
mname, cause.getMessage());
}
Это должно сработать для вас:
((Foobar)instance).fooMethod()