Как вызвать метод дочернего класса из родительского класса через отражение - PullRequest
0 голосов
/ 08 января 2019

Я хочу создать меню, которое должно заполняться произвольными методами, помеченными аннотацией. Методы должны вызываться из базового класса. К сожалению, java.lang.ClassCastException выбрасывается, поскольку функция method.invoke ожидает объект, который является экземпляром дочернего класса. Но я получаю только базовый класс.

Вот что я попробовал:

public abstract Class BaseClass{

    private void invokeSomeMethod(){
        final Method[] methods= getClass().getDeclaredMethods();

        for (Method method : methods) {
            if (method.isAnnotationPresent(MenuFunction.class)) {
                MenuFunction menuFunction = method.getAnnotation(MenuFunction.class);
                menuFunction.invoke(this); //Throws 'java.lang.ClassCastException' 
            }
        }
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ METHOD })
    public @interface MenuFunction {
        String Label();
    }

}

public Class ChildClass extends BaseClass{

     @MenuFunction(Label = "First method")
    public void setHigh(){
      //Arbitrary function 
    }

    @MenuFunction(Label = "Another method")
    public void setLow(){
      //Do something
    }

}

1 Ответ

0 голосов
/ 08 января 2019

Я думаю, что вы хотите сделать, это:

открытый абстрактный класс BaseClass {

public void invokeSomeMethod() throws InvocationTargetException, IllegalAccessException {
    final Method[] methods = getClass().getDeclaredMethods();
    for (Method method : methods) {
        if (method.isAnnotationPresent(MenuFunction.class)) {
            MenuFunction menuFunction = method.getAnnotation(MenuFunction.class);
            method.invoke(this); //invoke method here'
        }
    }
}

}

public class ChildClass extends BaseClass{

    @MenuFunction(Label = "hello")
    public void hello() {
        System.out.println("hello");
    }
    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {

        new ChildClass().invokeSomeMethod();
    }
}

Результат:

привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...