当前位置: 首页 > 面试题库 >

在继承的情况下使用model.getClass()。getMethod的问题

司空思聪
2023-03-14
问题内容

在开发桌面应用程序时,我在Oracle
Network上关注本文以实现MVC。但是,我有一个问题:我正在使用由和扩展的抽象
Directory 类。模型管理器方法之一接受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对象的数组,这些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 {

}


 类似资料:
  • 问题内容: 扩展基类时,Java中的内存使用情况如何。 子类是否包含基类的实例(具有其自身的开销和全部开销),还是仅具有其自身的16字节的开销? 那么,更具体地说,Bar实例的内存使用量是多少? 是吗 要不就 问题答案: 没有双重开销。 Java将采用该类,超类,计算所有字段所需的空间,并为一个实例分配所需的空间。 仅从内存的角度来看,根本不存在超类的概念,有Foo的实例仅需要一个int的内存,而

  • 问题内容: 我想在Python中实现自定义列表类作为的子类。为了获得所有列表操作的完全类型兼容性,我需要从基类中重写的最少方法集是什么? 这个问题表明至少需要重写。从进一步的研究,也和是必需的。所以我有这段代码: 下列语句即使没有覆盖方法也可以按需工作: 这些语句仅与上述类定义中的覆盖方法一起使用: 我唯一不知道如何实现的是使扩展切片返回正确的类型: 我需要在类定义中添加些什么才能获得类型? 另外

  • 问题内容: 这主要是关于Java继承的问题。我正在开发一个有2个窗口的程序,这两个窗口将在单独的类中开发,这将扩展JPanel。第一类是“ FileSub1”,第二类是“ FileSub2”。 这两个类共有许多方法,因此我想创建一个名为“ Files”的类,并将“ FileSub1”和“ FileSub2”作为其子类。但是Java不支持多重继承!我在这里可以做什么? 问题答案: 我不明白为什么您需

  • 我在应用程序中实现了firebase,以便使用它的通知服务,它工作了,今天决定使用它的键/值特性,但意识到无论我在从继承的类中编写什么,都不会发生任何事情。所以我决定移除my类以达到dubugging的目的,但我还是收到了通知。所以我从清单中删除了firebase消息传递服务,删除了应用缓存并运行了项目,但我仍然得到通知!我能阻止通知到来的唯一方法是移除Gradle中的firebase依赖项。这里

  • 并尝试通过Hibernate使用策略连接实现继承,但当我使用此策略时,我收到异常: 奇怪的是,如果我选择另一个策略(单表或TABLE_PER_CLASS),错误不会出现

  • 本文向大家介绍请问在什么情况下回使用assert?相关面试题,主要包含被问及请问在什么情况下回使用assert?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA 调试 assertion (断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个 boolean表达式进行检查,一个正确程序必须保证这个boolea