【问题标题】:Problem using model.getClass().getMethod in case of inheritance在继承的情况下使用 model.getClass().getMethod 的问题
【发布时间】:2011-06-11 20:44:47
【问题描述】:

我在 Oracle 网络上关注这个article,以便在开发桌面应用程序时实现 MVC。 不过,我有一个问题:我正在使用由SimpleDirectoryWildcardDirectory 扩展的抽象Directory 类。模型管理器方法之一接受 Directory 作为参数:

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 时遗漏了一些东西。

编辑:我读过docsgetMethod 它说

parameterTypes 参数是一个 Class 对象数组,用于标识 方法的形式参数类型, 按照声明的顺序。

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

【问题讨论】:

    标签: java reflection inheritance


    【解决方案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 {
    
    }
    

    【讨论】:

    • 这是一个通用控制器的问题。我不能那样做,我需要在运行时知道类。其次,SimpleDirectory 扩展了 Directory,所以在继承方面没有解决方案吗?
    • tnx,我读过它,但我认为它不一样,因为他在谈论接口,我在继承方面遇到了麻烦。在我看来 isAssignableFrom 并不能解决我的问题。
    • 我一回家我会尽力让你知道的。
    • method.getParameterTypes()[0].isAssignableFrom(child.getClass())可以写成method.getParameterTypes()[0].isInstance(child)
    【解决方案2】:
    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() 添加到孩子

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2016-03-06
      • 2018-09-13
      相关资源
      最近更新 更多