Проблема использования model.getClass (). GetMethod в случае наследования - PullRequest
2 голосов
/ 19 января 2011

Я следую этой статье о Oracle Network, чтобы реализовать MVC при разработке настольных приложений. У меня проблема: я использую абстрактный класс 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, которые идентифицируют формальные типы параметров метода, в заявленном порядке.

Так что я предполагаю, что это проблема.

Ответы [ 2 ]

3 голосов
/ 19 января 2011
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 {

}
0 голосов
/ 10 февраля 2015
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 {

}

Вам нужно добавить .getSuperclass () к потомку

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