开发者

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜