Подтвердить что ты не робот

Вызов универсального метода путем отражения в java

Как вызвать пользовательский общий метод путем отражения в java?

class Person
{
  public <T> void print(T t)
   {
      System.out.println(t.toString());
   }
}
4b9b3361

Ответ 1

Генераторы стираются во время компиляции, они предоставляют дополнительную информацию компилятору для определения ошибок. Они фактически не меняют подпись метода в файле .class.

Это означает, что вы вызываете общий метод путем отражения в Java точно так же, как вы вызываете не-общий метод в Java, за исключением того, что вместо указания типа T вы должны указать тип Object.

Есть так много учебников о том, как называть регулярный метод отражением, что я не решаюсь добавить еще один; однако, если вам действительно нужно руководство о том, как вызвать метод путем отражения, добавьте комментарий ниже, и я добавлю необходимый код.

Если вы обнаружите, что все работает не так, как ожидалось, вы всегда можете запустить javap в файле скомпилированного класса, чтобы убедиться, что вы используете нужные объекты в списке аргументов. Возможно, если вы укажете общую подпись типа <T extends List>, результирующий объект параметра может фактически быть объектом List.

Ответ 2

Это работает для меня.

Method method = Person.class.getMethod("print", Object.class);

method.invoke(new Person(), "this is a string");
method.invoke(new Person(), 273);
method.invoke(new Person(), new Object());

печать

this is a string
273
[email protected]

Конечно, теория, лежащая в основе этого, прекрасно объясняется в @Edwin answer.

Ответ 3

Чтобы выделить точку, указанную в ответе Эдвина, где мы используем extends в родовом типе: если у вас есть класс вроде

GenericHibernateDao<T extends Serializable>

и метод

public T save( T entity ) {};

чтобы вызвать метод save, используя рефлексию, вы должны использовать класс Serializable, т.е. вам нужно использовать:

Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class);

а не Object.class как параметр, так как мы используем

<T extends Serializable>