Problem using model.getClass().getMethod in case of inheritance
I'm following this article on Oracle Network to implement MVC when developing desktop applications.
I have a problem, though: I'm using an 开发者_开发百科abstract Directory class extended by SimpleDirectory
and WildcardDirectory
. One of the model manager method accepts a Directory as argument:
public void addDirectoryDummy(Directory d){
System.out.println("Hello!");
}
The abstract controller uses a setModelProperty to call this method:
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();
}
}
}
I call it from my actual controller like this:
public void dummy( Directory d){
setModelProperty( BACKUP_DUMMY, d );
}
In my view I have:
this.controller.dummy( new SimpleDirectory(0,"ciao") );
I have the following error:
java.lang.NoSuchMethodException: it.univpm.quickbackup.models.BackupManager.addDirectoryDummy(it.univpm.quickbackup.models.SimpleDirectory)
at java.lang.Class.getMethod(Class.java:1605)
How do I solve this problem? I'm missing something in the usage of getMethod
.
EDIT: I've read the docs and in getMethod
it says
The parameterTypes parameter is an array of Class objects that identify the method's formal parameter types, in declared order.
So I'm guessing that's the problem.
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 {
}
package com.test;
import java.lang.reflect.Method;
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 {
Method method = test.getClass().getMethod("doSomething", new Class[] { child.getClass().getSuperclass() });
method.invoke(test, child);
System.out.println("This works");
} 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 {
}
You need add .getSuperclass() to child
精彩评论