动态对象创建和函数调用
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";
...那么我希望这会解决问题。
问题是调用本田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";
...那么我希望这会解决问题。