【发布时间】:2021-08-16 14:43:15
【问题描述】:
我想创建动态对象,以便调用类的相应方法。所有类和接口都在不同的文件中,但在同一个文件夹下 给定:
interface Method
{
public void display();
}
class Car implements Method
{
public void display()
{
System.out.print("Car method");
}
}
class Honda implements Method
{
public void display()
{
System.out.print("Honda method");
}
}
public class Main {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
String className = "Car";
Class cls = Class.forName(className);
Method method = (Method) cls.getConstructor().newInstance();
method.display();
}
}
现在,如果在字符串中传递 Honda,那么我想调用字符串方法,但是如果我在字符串中传递 Car,那么我想获取 Car 方法作为输出,但是编译后这个方法不会被调用。没有错误,但也没有预期的输出。如何获得所需的输出。请帮忙。
【问题讨论】:
-
最好的选择是定义一个定义
display()方法的接口。让Car和Bicycle实现这个接口,然后,通过newInstance()为默认构造函数或Constructor类为非默认构造函数实例化对象后,将生成的对象转换为该接口并将其用作该类型的常规对象。请注意,除了纯反射,您还可以深入研究MethodHandle,与反射相比,它更轻量级。 -
这能回答你的问题吗? Casting a class using reflection in java
-
警告:您使用的是原始类型
Class。不要使用原始类型,始终提供必要的类型参数。 -
首先,为了清楚起见,我将接口命名为
Displayable,因为它基本上提供了这个接口。其次,“Honda”不是类名。这是一个车辆名称。您需要向Class.forName(...)提供完全限定的类名,以便它加载实际的类定义并为其创建类对象。如果您要使用像org.acme.Car这样的包结构,即您需要调用Class.forName("org.acme.Car"),或者对于默认包只需调用Class.forName("Car")。但是Honda不是类名,至少不会出现在您的代码中 -
在某些时候你确实知道你想要/需要创建什么对象,这就是你初始化它的时刻。
Class.forName(...)仅在类定义不是应用程序类路径的一部分时才需要使用,因此应用程序类加载器或其任何被要求为该类提供类对象的父级不知道类的字节.new XYZ(...)基本上是整个样板代码的捷径,如果针对应用程序类加载器,您需要编写实例化类的对象
标签: java method-call dynamicobject