动态对象创建和函数调用
Posted
技术标签:
【中文标题】动态对象创建和函数调用【英文标题】:dynamic object creation and function call [duplicate] 【发布时间】:2021-08-17 19:53:09 【问题描述】:问题是调用本田类的显示方法。将调用哪个类方法取决于将在运行时传递的字符串变量。在这里,我使用了 Honda 的一个父类,以便实现运行时多态性。但后来我得到了 ClassNotFoundException,即使它包含在 main 的 throws 子句中。不知道该怎么办。
这是同一个包中所有三个类的代码。
Vechicle.java
package com.company;
public class Vehicle
public void display()
System.out.println("Random text");
本田.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 类中的 ClassNotFoundException,但 extends 和 throws 不能同时工作。请帮我找出问题。
【问题讨论】:
【参考方案1】:但是我得到了 ClassNotFoundException,即使它包含在 main 的 throws 子句中。
throws
子句不会阻止异常发生 - 它只是指定该方法可能会抛出该检查异常。
问题是Class.forName
接受完全限定的类名,而您没有完全限定名Honda
的类。您有一个具有完全限定名称 com.company.Honda
的类。
如果您将代码的开头更改为:
String className = "com.company.Honda";
...那么我希望这会解决问题。
【讨论】:
太棒了。非常感谢 @sakshisinghal:我建议利用这个机会来思考您的诊断过程——想想您可以问自己哪些问题来解决问题。异常(相对于编译时错误)永远不会由throws
子句等引起。发生异常时,请使用消息和堆栈跟踪来找出导致它的原因。跨度>
以上是关于动态对象创建和函数调用的主要内容,如果未能解决你的问题,请参考以下文章
设计模式代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )