Java list of uninstantiated classes
class, java
Solution
You cannot store types, but you can store the `Class` object for each class loaded by the JVM. When the JVM loads and initializes a class on the classpath, it creates a single `Class` object for that class.
The `Class` class gives you access to a number of instance methods for performing reflection on your program.
Also, how might one do this and how inadvisable is it (and why)?
For example
List<Class<?>> classes = new ArrayList<>();
classes.add(Example.class);
Now you can go through the elements and call different methods depending on what you want to do. If you want to create a new instance (and your class has a no-arg constructor), you can do
classes.get(0).newInstance();
If you don't have a no-argument constructor, you will need to get `Constructor` references from the `Class` object.
If you need to invoke methods (whether `static` or not), you need to get a `Method` reference. Read through the javadoc.
how inadvisable is it (and why)?
There are some things you cannot do without reflection, but it is generally discouraged.
- What is reflection and why is it useful?
- Java Reflection Performance
- Why should I use reflection?
- Java Reflection: Why is it so slow?
- Why is Java's reflection package considered the dark side of the force?
You should try to minimize using Reflection when you can very well use the `Factory` pattern to achieve your goals in this situation.
User user2864740 suggests
I would have a list of "factories that know how to create the appropriate object", if practical - really depends upon where this data comes from and what role it has.
Problem
Is it possible to construct a `List<Object>` wherein the elements are uninstantiated classes, with the intention of getting one of the list elements and running a static method from that class or instantiating a new instance of that class? Also, how might one do this and how inadvisable is it (and why)? To add some context: I want to make an application which generates a randomized city, placing buildings in the city, where each building is an instance of one of the many building classes, each inheriting from an abstract base class. To choose a building appropriate for a certain piece of land, the program may iterate over a list of all possible building classes, checking whether the required parameters can be met for that building (minimum / maximum height, footprint, shape, etc.) or these classes may be stored in some other manner, possibly using maps or some other structures. The bottom line is that I need to store (refferences?) to uninstantiated classes.