Java 未实例化类列表

Voi*_*tar 3 java class

是否可以构造一个List<Object>其中元素是未实例化的类,目的是获取列表元素之一并从该类运行静态方法或实例化该类的新实例?另外,如何才能做到这一点以及这样做有多不可取(以及为什么)?

添加一些上下文:我想创建一个生成随机城市的应用程序,将建筑物放置在城市中,其中每个建筑物都是许多建筑物类之一的实例,每个建筑物类都继承自一个抽象基类。为了选择适合某块土地的建筑物,程序可能会迭代所有可能的建筑物类别的列表,检查是否可以满足该建筑物所需的参数(最小/最大高度、占地面积、形状等)或这些类可以以某种其他方式存储,可能使用映射或某些其他结构。最重要的是我需要存储(引用?)到未实例化的类。

Sot*_*lis 5

您无法存储类型,但可以存储ClassJVM 加载的每个类的对象。当 JVM 加载并初始化类路径上的类时,它会Class为该类创建一个对象。

该类Class使您可以访问许多实例方法来对程序执行反射。

另外,如何才能做到这一点以及这样做有多不可取(以及为什么)?

例如

List<Class<?>> classes = new ArrayList<>();
classes.add(Example.class);
Run Code Online (Sandbox Code Playgroud)

现在您可以浏览这些元素并根据您想要执行的操作调用不同的方法。如果你想创建一个新实例(并且你的类有一个无参数构造函数),你可以这样做

classes.get(0).newInstance();
Run Code Online (Sandbox Code Playgroud)

如果您没有无参构造函数,则需要ConstructorClass对象获取引用。

如果您需要调用方法(无论static是否),您需要获取Method引用。通读javadoc

它有多不可取(以及为什么)?

有些事情你不经过反思就不能做,但通常不鼓励这样做。


当您在这种情况下可以很好地使用该Factory模式来实现您的目标时,您应该尽量减少使用反射。

用户user2864740建议

如果可行的话,我会有一个“知道如何创建适当对象的工厂”列表 - 实际上取决于这些数据来自哪里以及它具有什么作用。