处理“自定义”(未知)Java类的最佳方法

时间:2012-11-15 02:22:02

标签: java

我正在为Java实现一种在线编程竞赛。该想法是竞赛的参与者为应用程序编写控制器并将其发送到竞争服务器。该自定义控制器必须从API的基类派生。

好的,所以所有参与者都可以编写自己的控制器类,可能还包括其他自定义类,并且由于控制器的主类派生自API(抽象)基类,服务器上的应用程序可以轻松调用特定方法为了控制应用程序,在某个intervall中使用子类(即自定义控制器)。

我现在的问题是:您是否有任何建议我应该如何从API的角度处理这种情况,以便它可以方便地动态加载自定义控制器实现?

我想要避免的是参与者需要将API jar文件包含到他们的Java项目中(例如在Eclipse中),然后编写他们的控制器类,再将所有内容放入可执行jar中并将其上传到竞争服务器。我绝对不想在服务器上执行完全自定义的应用程序。

我宁愿让参与者只上传他们的自定义控制器类。然后在服务器上,该类应自动加载并作为应用程序的一部分。我基本上看到两个选项:

  1. 将已编译的.class文件上传到服务器;或
  2. 上传Java源代码文件,然后在服务器上编译
  3. 您会建议以下两个选项中的哪一个?为什么? 或者:你有另一个更好的选择吗?

    此外,我应该如何处理多个类的上传?如果可能,我想允许参与者在主控制器类旁边编写其他实用程序类。

    提前感谢您的所有想法!

2 个答案:

答案 0 :(得分:1)

Web服务器,Eclipse和其他平台使用的模式是通过指定其架构来指定部署描述符(通常是XML文件)。您的案例中的部署描述符将标识jar文件的名称(通常与部署描述符位于同一目录中)和Java类的完全限定名称(在本例中为自定义控制器)。

您编写的程序读取部署描述符以发现jar文件的名称(您可以通过类加载器访问)和客户控制器的名称(使用类加载器加载)。

这使您可以接收任意数量的条目,每个条目都包含在自己的目录中。

您甚至可以通过让部署描述符成为jar本身具有明确定义名称的文件来获得幻想,从而使jar成为一个完全融入的条目。

答案 1 :(得分:1)

首先,在Eclipse项目中让开发人员包含API jar并不意味着您需要将其作为完整的应用程序运行。实际上,您应该向开发人员提供API jar。但是,开发人员应该只向他们提供他们自己开发的课程。

我建议不采取“接收源代码并在服务器上编译”的方法。这简直使情况变得不必要地复杂化。

服务器收到JAR后,您只需创建相应的类加载器即可加载其代码。

接下来的问题是:你怎么知道从他们的JAR加载哪个类?

有很多方法可以这样做,在这里我建议两种最简单的方法:

1)与@ChrisGerken建议类似,有一个“部署描述符”。在简化视图中,部署描述符仅是具有预定义格式的文本文件,位于预定义位置。您的代码可以从提供的JAR中读取此文件,并且您可以要求开发人员将类名(其实现类)放在描述符中,并且您可以通过反射轻松地实例化其类。

2)另一种方法与SLF4J加载其适配器的方式类似:开发人员应在预定义的包中使用预定义的类名进行实现。您可以通过反射轻松创建实现类,并保存读取描述符文件的步骤。但是你失去了灵活性。

两种方式都应该有效。选择一个适合您需要的(我建议先选择2,然后再加上1的支持)