是否有可能构造一个List<Object>,其中的元素是非实例化类,目的是从该类中获取一个列表元素并运行一个静态方法,或者实例化该类的一个新实例?另外,如何才能做到这一点,这是多么不明智(以及为什么)?
添加一些上下文:我想创建一个生成随机城市的应用程序,将建筑物放置在城市中,其中每个建筑都是许多建筑类中的一个实例,每个类都继承了一个抽象基类。若要选择适合某一特定土地的建筑物,程序可以遍历所有可能的建筑类的列表,检查该建筑物是否满足所需的参数(最小/最大高度、足迹、形状等)。或者,这些类可以以其他方式存储,可能使用映射或其他结构。底线是我需要存储(参考资料?)未实例化的类。
发布于 2013-12-22 05:55:56
您不能存储类型,但是可以为JVM加载的每个类存储Class对象。当JVM在类路径上加载和初始化类时,它会为该类创建一个Class对象。
Class类允许您访问用于在程序上执行反射的许多实例方法。
另外,如何才能做到这一点,这是多么不明智(以及为什么)?
例如
List<Class<?>> classes = new ArrayList<>();
classes.add(Example.class);现在,您可以查看这些元素,并根据您想要做的事情调用不同的方法。如果您想要创建一个新实例(而且您的类有一个no-arg构造函数),您可以这样做。
classes.get(0).newInstance();如果没有无参数构造函数,则需要从Constructor对象获取Class引用。
如果您需要调用方法(不管是static还是非Method ),则需要获得一个Method引用。通过javadoc阅读。
这有多不明智(以及为什么)?
有些事情你不能没有反思,但它通常是不鼓励的。
当您能够很好地使用Factory模式来实现这种情况下的目标时,您应该尽量减少使用反射。
如果实际的话,我会列出“工厂知道如何创建适当的对象”--实际上取决于这些数据的来源和角色。
发布于 2013-12-22 05:56:53
您可以像这样实例化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 2013https://stackoverflow.com/questions/20726652
复制相似问题