【问题标题】:Including Java classes and running them during runtime包括 Java 类并在运行时运行它们
【发布时间】:2009-05-18 19:24:11
【问题描述】:

我有一个需要“插件”接口的 Java 项目。我正在考虑加载某种具有默认方法的类文件,例如initialize()shutdown(),它们将在类加载到应用程序后调用。这是这样做的方法吗?我将如何解决这个问题?

【问题讨论】:

  • 您是在询问动态加载类或定义类的初始化行为吗?

标签: java reflection dynamic-loading


【解决方案1】:

查看Class 类,特别是forName 方法,它允许您按名称引用类。路径中的任何类都可以这样加载。是否可以重新加载我不知道。

无论如何,您要动态加载的每个类都必须实现您的自定义AddOn 接口,从而实现initializeshutdown

【讨论】:

  • 这成功了!我不知道这是否是“正确”的做法,我很高兴收到反馈。请记住,这仅用于加载一个类: Class classfoo = Class.forName("addonclass");对象 foo = null;对象[] foo2 = null; classfoo.getMethod("initialize").invoke(foo, foo2);
  • 很高兴听到它有效!我自己也对有关“正确”方式的反馈感兴趣。我觉得存在一种更优雅的方式......
  • “我感觉有一种更优雅的方式存在。”不,这是记录在案的正确方法。
【解决方案2】:

首先,您需要一个ClassLoader;你可以用getClass().getClassLoader() 得到当前的,但是你的插件类必须在类路径中。您可能需要创建一个自定义类加载器来搜索您的插件目录。

获得ClassLoader 后,您可以将其用于load a class。这给了你一个Class 对象;然后,您可以使用反射来调用 initialize() 方法(如果存在)。

【讨论】:

  • 如果你想要一种非标准的方式来加载类,你只需要你自己的类加载器。如果该类作为“.class”文件存在于类路径上的文件夹中,标准类加载器将执行此操作。例如,如果您想在幕后从 I​​nternet 下载该类,那么您需要一个自定义类加载器。
【解决方案3】:

如果你看更复杂的东西,你可以试试:http://jpf.sourceforge.net

... JPF 提供了一个动态发现和加载“插件”的运行时引擎。插件是一个结构化组件,它使用“清单”向 JPF 描述自己。 ...

【讨论】:

    【解决方案4】:

    另一个实现插件的好方法是java.util.Serviceloader。看看javadocs,他们解释了原理。

    【讨论】:

      【解决方案5】:
      public class SomeClass { 
          static {
              System.out.println("Being called with the class is loaded");
              initialize();
          }
          static void initialize(){}
      }
      

      这是你的问题吗?

      【讨论】:

      • 不错 :) 但是如何从文件加载和运行一个类?该类不会随应用程序一起提供,用户将“下载”插件并将其添加到“插件”文件夹中。该应用程序将在启动时加载所有插件。
      • 是的。我实际上并没有完全明白你的问题是什么。 Class.forName 几乎是要走的路。
      猜你喜欢
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2015-03-09
      相关资源
      最近更新 更多