在运行时查找新的Java类

时间:2010-07-22 14:32:08

标签: java

我有一个功能,我希望为客户提供我们正在准备的软件模型 - 我想知道它是否

  1. 可能
  2. 聪明(a.k.a。不傻)
  3. 最好的事情
  4. 我希望客户能够编写一个实现我的Computable接口的java类,并将其粘贴在某个预定的文件夹中。该文件夹将包含.java文件而不是.class文件。然后,在运行时,我希望我的程序搜索该文件夹并从该文件夹中提取所有Computables并将它们存储在从ComputableComputable对象的名称的映射中。 Computable应该只有一个默认构造函数,而it接口只有一个名为compute的方法,它将Object的数组映射到Object

8 个答案:

答案 0 :(得分:9)

Java SE 6中引入的Java Compiler API应该可以满足您的需求。

答案 1 :(得分:3)

您可能会发现Google Reflections对于在类路径中查找实现/扩展某个接口/超类的类非常有用。然后就像

一样简单
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeClassOrInterface>> subTypes = reflections.getSubTypesOf(SomeClassOrInterface.class);

然后,为了测试它是否确实具有no-arg默认构造函数,只需检查每个Class#newInstance()是否不会抛出任何异常。

答案 2 :(得分:2)

答案 3 :(得分:1)

  

如果在运行时编译很容易就可以了。

您可以根据需要使用javax.tools进行编译。 Create dynamic applications with javax.tools也可以提供帮助。也可以这样做in memory

一个警告:使用编译器会在JDK上创建依赖关系;单靠JRE是不够的。

答案 4 :(得分:0)

答案 5 :(得分:0)

认为如果您允许客户使用Groovy之类的东西来输入代码声明会更简单,Groovy足够Java,并且很容易在运行时从String值执行。

答案 6 :(得分:0)

迭代文件夹中的文件列表很容易。有人提到可以从Java调用Java编译器(如果你重新分发JDK,我认为这是合法性需要检查的一点!)这就是大部分的战斗。

您似乎有一个固定的模型,其中只从文件夹中提取满足特定界面的文件。我认为这是你的方法需要提供一点点的地方。这样做的合理方式(IMO)是编译该文件夹中的所有文件,然后将它们的类隐藏在某处,您可以加载并反映它们,然后确定它们中的哪些“做”界面,哪些没有。那些没有的东西将被不必要地加载到你的JVM中,但除非故意浪费太多,否则你执行的代码不会损害你的程序。

确定哪些可执行事物后,您可以将这些类(或其实例)存储在Collection中,并随意执行任何操作。你只是忽略了其他的。

答案 7 :(得分:0)