动态对象创建和函数调用

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 子句等引起。发生异常时,请使用消息和堆栈跟踪来找出导致它的原因。跨度>

以上是关于动态对象创建和函数调用的主要内容,如果未能解决你的问题,请参考以下文章

设计模式代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

动态指向现有对象或创建新对象

自动对象和静态局部对象

转载ABAP中数据和对象的动态创建和调用

JS如何创建对象和继承对象

代理模式之JDK动态代理