С отражение Java, как инстанцировать нового объекта, затем назовите метод на нем?

Хэш-код объекта не должен быть уникальным.

правило проверки:

  • хэш-коды равны? Тогда назовите полное (медленным) Equals метод.
  • разве хэш-коды не равны? Тогда эти два объекта определенно не равны.

Все, что Вы хотите, GetHashCode алгоритм, который разделяет Ваш набор на примерно даже группы - это не должно формировать ключ, поскольку HashTable или Dictionary<> должен будет использовать хеш для оптимизации извлечения.

, Сколько времени Вы ожидаете, что данные будут? Как случайный? Если длины варьируются значительно (скажите для файлов), тогда просто возвратите длину. Если длины, вероятно, будут подобным взглядом на подмножество байтов, которое варьируется.

GetHashCode должно быть намного более быстрым, чем Equals, но не должен быть уникальным.

Две идентичных вещи никогда не должны иметь различные хэш-коды. Два различных объекта не должны иметь тот же хэш-код, но некоторые коллизии должны ожидаться (в конце концов, существует больше перестановок, чем возможные целые числа на 32 бита).

20
задан Chii 23 November 2009 в 12:29
поделиться

4 ответа

Method method = getClass().getDeclaredMethod("methodName");
m.invoke(obj);

Это на случай, если у метода нет аргументов. Если да, добавьте типы аргументов в качестве аргументов этого метода. obj - это объект, для которого вы вызываете метод.

См. Документацию java.lang.Class

9
ответ дан 30 November 2019 в 01:08
поделиться

Чисто отражение: Method.invoke . Другое решение состоит в том, чтобы потребовать от элемента, который вы создаете рефлексивно, реализовать известный интерфейс, преобразовать его в этот интерфейс и использовать как обычно.

Последний обычно используется для «плагинов», первый не используется очень часто.

4
ответ дан 30 November 2019 в 01:08
поделиться

Вы можете начать с чтения об этом здесь .

Что касается код, который вы используете после этого (из того же ресурса):

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());
    }
3
ответ дан 30 November 2019 в 01:08
поделиться

Это должно сработать для вас:

((Foobar)instance).fooMethod()
2
ответ дан 30 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: