Как вызвать пользовательский общий метод путем отражения в java?
class Person
{
public <T> void print(T t)
{
System.out.println(t.toString());
}
}
Как вызвать пользовательский общий метод путем отражения в java?
class Person
{
public <T> void print(T t)
{
System.out.println(t.toString());
}
}
Генераторы стираются во время компиляции, они предоставляют дополнительную информацию компилятору для определения ошибок. Они фактически не меняют подпись метода в файле .class
.
Это означает, что вы вызываете общий метод путем отражения в Java точно так же, как вы вызываете не-общий метод в Java, за исключением того, что вместо указания типа T
вы должны указать тип Object
.
Есть так много учебников о том, как называть регулярный метод отражением, что я не решаюсь добавить еще один; однако, если вам действительно нужно руководство о том, как вызвать метод путем отражения, добавьте комментарий ниже, и я добавлю необходимый код.
Если вы обнаружите, что все работает не так, как ожидалось, вы всегда можете запустить javap
в файле скомпилированного класса, чтобы убедиться, что вы используете нужные объекты в списке аргументов. Возможно, если вы укажете общую подпись типа <T extends List>
, результирующий объект параметра может фактически быть объектом List
.
Это работает для меня.
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.
Чтобы выделить точку, указанную в ответе Эдвина, где мы используем 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>