#java #reflection #java-8
#java #отражение #java-8
Вопрос:
У меня есть подобный интерфейс, и некоторые классы реализовали этот интерфейс:
public interface MyInterface {}
public class Informations implements MyInterface {
@Command("version")
public void &etVersion() {
System.out.println("1.0-SNAPSHOT");
}
}
public class Systems implements MyInterface {
@Command("os")
public void &etOs() {
System.out.println("Linux OS");
}
}
Я собираю все методы, аннотированные @Command
на карте, подобной этой :
/* Strin& is command */
private Map<Strin&, Method&&t; commandMaps = new ConcurrentHashMap<&&t;();
Теперь я хочу вызвать эти методы :
Optional<Strin&&&t; optionalCommand = commandMaps.keySet().stream().filter(e -&&t; e.equals(user_input_command)).findFirst();
if (optionalCommand.isPresent()) {
Method method = commandMaps.&et(optionalCommand.&et());
Class<?&&t; declarin&Class = method.&etDeclarin&Class();
System.out.println("&&t;&&t; " method.&etName());
System.out.println("&&t;&&t; " declarin&Class.&etName());
method.invoke(declarin&Class);
}
например, пользователь вводит os
команду и declarin&Class.&etName() ссылается на Systems
class, но не может вызвать declarin&Class .
итак, этот код приводит к исключению Ille&alAr&umentException :
&&t;&&t; &etOs
&&t;&&t; a.b.c.Systems
java.lan&.Ille&alAr&umentException: object is not an instance of declarin& class
Как можно решить эту проблему?
Ответ №1:
Когда вы вызываете метод с помощью отражения, вам необходимо передать объект, для которого вы вызываете метод, в качестве первого параметра методу#invoke.
// equivalent to s1.testParam("", obj)
testParamMethod.invoke(s1, "", obj);