首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未实例化类的Java列表

未实例化类的Java列表
EN

Stack Overflow用户
提问于 2013-12-22 05:48:37
回答 2查看 460关注 0票数 3

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

添加一些上下文:我想创建一个生成随机城市的应用程序,将建筑物放置在城市中,其中每个建筑都是许多建筑类中的一个实例,每个类都继承了一个抽象基类。若要选择适合某一特定土地的建筑物,程序可以遍历所有可能的建筑类的列表,检查该建筑物是否满足所需的参数(最小/最大高度、足迹、形状等)。或者,这些类可以以其他方式存储,可能使用映射或其他结构。底线是我需要存储(参考资料?)未实例化的类。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-22 05:55:56

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

Class类允许您访问用于在程序上执行反射的许多实例方法。

另外,如何才能做到这一点,这是多么不明智(以及为什么)?

例如

代码语言:javascript
复制
List<Class<?>> classes = new ArrayList<>();
classes.add(Example.class);

现在,您可以查看这些元素,并根据您想要做的事情调用不同的方法。如果您想要创建一个新实例(而且您的类有一个no-arg构造函数),您可以这样做。

代码语言:javascript
复制
classes.get(0).newInstance();

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

如果您需要调用方法(不管是static还是非Method ),则需要获得一个Method引用。通过javadoc阅读。

这有多不明智(以及为什么)?

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

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

用户user2864740建议

如果实际的话,我会列出“工厂知道如何创建适当的对象”--实际上取决于这些数据的来源和角色。

票数 5
EN

Stack Overflow用户

发布于 2013-12-22 05:56:53

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

代码语言:javascript
复制
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();
  } 
}

当我运行它时,输出

代码语言:javascript
复制
Sun Dec 22 00:56:06 EST 2013
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20726652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档