【问题标题】:Is it possible to make a list of classes without instantiating them as actual objects?是否可以在不将它们实例化为实际对象的情况下制作类列表?
【发布时间】:2013-02-24 18:04:10
【问题描述】:

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

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

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

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

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

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

非常感谢任何帮助。

【问题讨论】:

  • 你不需要实例化一个类来调用它的静态方法...
  • 是的。我知道。但在我看来,如果不将它们实例化为对象,就无法列出类。这违背了我想要做的事情。
  • List<Class<?>> 似乎是您想要的。给它添加一个类:myList.add(FooBar.class);

标签: java


【解决方案1】:

你可以使用反射来做这样的事情:

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。

【讨论】:

  • 我似乎找不到一个只接受字符的 .getDeclaredMethod() 。这应该包含我要调用的方法的名称吗?谢谢!
  • This 是您要查找的内容 - 如果没有参数,parameterTypes 是可选的
【解决方案2】:

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

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

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

classes[0].newInstance();

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

【讨论】:

    【解决方案3】:

    你可以有一个 Class 对象的列表,例如

    List&lt;Class&gt; myClasses = new ArrayList&lt;Class&gt;();

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

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

    【讨论】:

      猜你喜欢
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2022-07-22
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多