我的程序中有一组可以实例化的类。每个类都有一个与之关联的静态方法,它可以更新该类的特定方面。
在运行时,程序选择使用集合中的许多类。
然后在程序运行时将这些类的多个版本实例化为对象。
在整个程序中,我需要调用与各个类关联的静态方法,但只有程序在运行时选择使用的静态方法。
我是否可以在不实例化的情况下创建包含正在使用的类的列表/数组?那么我可以通过该列表并在每个类上调用静态方法吗?
我发现这样做的另一种方法是为每个正在使用的类实例化一个对象,并将它们存储在一个数组中并从那里调用方法。这似乎有点低效,而且不是很优雅。
非常感谢任何帮助。
答案 0 :(得分:4)
您可以使用反射来执行以下操作:
List <Class<?>> classes = new ArrayList<Class<?>>();
// alternatively, classes.add(com.foo.MyClass1.class);
classes.add(Class.forName("com.foo.MyClass1"));
classes.add(Class.forName("com.foo.MyClass2"));
// ...etc
Method m = classes.get(0).getDeclaredMethod("staticFunction");
m.invoke(null); // pass in an instance of the class if this is an instance method
答案 1 :(得分:3)
我不确定你为什么要避免实例化,但如果你唯一要做的就是调用静态方法,那么没有理由创建对象。至于你的问题,你可以毫无问题地创建一个类数组。请记住,MyClass.class实际上是类Class的对象,因此这将起作用:
Class[] classes = new Class[] {MyClass1.class, MyClass2.class};
然后,您可以使用逻辑来选择其中一些。完成后,您可以使用反射实例化它们:
classes[0].newInstance();
希望它有所帮助,如果没有,请说明你的问题。请注意,将创建类对象本身(不确定是否可以阻止类加载器加载它们)。
答案 2 :(得分:1)
您可以拥有Class对象列表,例如
List<Class> myClasses = new ArrayList<Class>();
要将项目添加到列表,您需要编写类似myClasses.add(Class1.class);
这是存储类列表的一种方法,无需创建每个类的实例。