在开发桌面应用程序时,我在Oracle Network上关注本文以实现MVC。但是,我有一个问题:我正在使用由和扩展的抽象 Directory 类。模型管理器方法之一接受Directory作为参数:SimpleDirectory``WildcardDirectory
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
编辑:我已经阅读了文档,并在getMethod其中说
parameterTypes参数是Class对象的数组,这些Class对象按声明的顺序标识方法的形式参数类型。
所以我想这就是问题所在。
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 { }