小编典典

在继承的情况下使用model.getClass()。getMethod的问题

java

在开发桌面应用程序时,我在Oracle
Network上关注本文以实现MVC。但是,我有一个问题:我正在使用由和扩展的抽象
Directory 类。模型管理器方法之一接受Directory作为参数:SimpleDirectory``WildcardDirectory

public void addDirectoryDummy(Directory d){
    System.out.println("Hello!");
}

抽象控制器使用setModelProperty调用此方法:

protected void setModelProperty(String propertyName, Object newValue) {



    for (AbstractModel model: registeredModels) {
        try {

            Method method = model.getClass().
                getMethod(propertyName, new Class[] {
                                                  newValue.getClass()
                                              }
                         );

            method.invoke(model, newValue);

        } catch (Exception ex) {
           ex.printStackTrace();
        }
    }
}

我从实际的控制器中这样调用它:

public void dummy( Directory d){
    setModelProperty( BACKUP_DUMMY, d );
}

我认为我有:

this.controller.dummy( new SimpleDirectory(0,"ciao") );

我有以下错误:

java.lang.NoSuchMethodException: it.univpm.quickbackup.models.BackupManager.addDirectoryDummy(it.univpm.quickbackup.models.SimpleDirectory)
    at java.lang.Class.getMethod(Class.java:1605)

我该如何解决这个问题?我在使用时缺少一些东西getMethod

编辑:我已经阅读了文档,并在getMethod其中说

parameterTypes参数是Class对象的数组,这些Class对象按声明的顺序标识方法的形式参数类型。

所以我想这就是问题所在。


阅读 307

收藏
2020-11-26

共1个答案

小编典典

public class Test
{
    public static void main(String[] args) throws Exception { 
        Test test = new Test();
        Child child = new Child();

        // Your approach, which doesn't work
        try {
            test.getClass().getMethod("doSomething", new Class[] { child.getClass() });

        } catch (NoSuchMethodException ex) {
            System.out.println("This doesn't work");
        }

        // A working approach
        for (Method method : test.getClass().getMethods()) {
            if ("doSomething".equals(method.getName())) {
                if (method.getParameterTypes()[0].isAssignableFrom(child.getClass())) {
                    method.invoke(test, child);
                }
            }
        }
        System.out.println("This works");

    }

    public void doSomething(Parent parent) {

    }
}

class Parent {

}

class Child extends Parent {

}
2020-11-26