Java未经实例化的类列表

时间:2013-12-22 05:48:38

标签: java class

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

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

2 个答案:

答案 0 :(得分:4)

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

Class课程可让您访问许多实例方法,以便在您的计划中执行reflection

  

另外,一个人怎么可能这样做以及它是如何不可取的(以及为什么)?

例如

List<Class<?>> classes = new ArrayList<>();
classes.add(Example.class);

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

classes.get(0).newInstance();

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

如果您需要调用方法(无论是否static),您需要获得Method引用。仔细阅读javadoc

  

它是不可取的(以及为什么)?

有些事情你不能没有反思,但通常不鼓励。


在这种情况下,如果能够很好地使用Factory模式来实现目标,则应尽量减少使用Reflection。

User user2864740 suggests

  

我会列出一些“知道如何创建的工厂”   适当的对象“,如果可行的话 - 真的取决于这个地方   数据来自于它的作用。

答案 1 :(得分:2)

您可以像这样实例化Class<?>的实例 -

List<Class<?>> al = new ArrayList<>();
al.add(java.util.Date.class);
for (Class<?> cls : al) {
  try {
    Constructor<?> ctor = cls.getConstructor(null);
    Object o = ctor.newInstance(null);
    System.out.println(o);
  } catch (Exception e) {
    e.printStackTrace();
  } 
}

当我刚刚运行它时,输出

Sun Dec 22 00:56:06 EST 2013