1

我的程序中有一组可以实例化的类。每个类都有一个与之关联的静态方法,用于更新该类的特定方面。

在运行时,程序选择使用集合中的一些类。

这些类的多个版本随后在程序运行时被实例化为对象。

在整个程序中,有一些关键点我需要调用与各种类相关的静态方法,但只调用程序在运行时选择的那些正在使用的方法。

我是否可以在不实例化它们的情况下创建一个包含正在使用的类的列表/数组?这样我就可以通过该列表并在每个类上调用静态方法?

我发现的唯一另一种方法是为每个正在使用的类实例化一个对象并将它们存储在一个数组中并从那里调用方法。这似乎有点低效,也不是很优雅。

任何帮助是极大的赞赏。

4

3 回答 3

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

查看ClassMethod的 javadoc 。

于 2013-02-24T18:10:41.357 回答
3

我不确定你为什么要避免实例化,但如果你唯一要做的就是调用静态方法,那么就没有理由创建对象。至于您的问题,您可以毫无问题地创建一个类数组。请记住,MyClass.class 实际上是 Class 类的对象,所以这会起作用:

Class[] classes = new Class[] {MyClass1.class, MyClass2.class};

然后,您可以使用您的逻辑来选择其中一些。完成后,您可以使用反射实例化它们:

classes[0].newInstance();

希望对您有所帮助,如果没有,请详细说明您的问题。请注意,将创建类对象本身(不确定您是否可以阻止类加载器加载它们)。

于 2013-02-24T18:09:53.030 回答
1

您可以拥有一个 Class 对象列表,例如

List<Class> myClasses = new ArrayList<Class>();

要将项目添加到列表中,您可以编写类似的代码myClasses.add(Class1.class);

这是存储类列表的一种方法,无需为每个类创建一个实例。

于 2013-02-24T18:11:56.263 回答