动态对象创建和函数调用

dynamic object creation and function call

问题是调用本田class显示方法。将调用哪个 class 方法取决于将在运行时传递的字符串变量。这里我使用了本田的一个父 class,这样我就可以实现运行时多态性。但是后来我得到了 ClassNotFoundException,即使它包含在 main 的 throws 子句中。无法确定要做什么。

这是同一个包中所有三个 classes 的代码。

Vechicle.java

package com.company;

public class Vehicle {
    public void display() {
        System.out.println("Random text");
    }
}

Honda.java

package com.company;

public class Honda extends Vehicle{
    public void display()
    {
        System.out.print("honda called");
    }

}

Main.java

package com.company;

import java.lang.reflect.InvocationTargetException;

public class Main {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

            String className = "Honda";
            Class cls = Class.forName(className);
            Vehicle v = (Vehicle) cls.getDeclaredConstructor().newInstance();
            v.display();
    }
}

我得到的错误是:

Exception in thread "main" java.lang.ClassNotFoundException: Honda
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at com.company.Main.main(Main.java:10)

我想我也需要处理 Honda class 中的 ClassNotFoundException,但扩展和抛出不能同时工作。请帮我找出问题所在。

But then I am getting ClassNotFoundException even that is included in the throws clause of main.

throws 子句不会阻止异常的发生 - 它只是指定该方法可能会抛出已检查的异常。

问题是 Class.forName 接受完全限定的 class 名称,而您没有 class 的完全限定名称 Honda .您有一个 class 的完全限定名称 com.company.Honda.

如果您将代码的开头更改为:

String className = "com.company.Honda";

...那么我希望这会解决问题。