Вызов отражения Java при getDeclaringClass

#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);