我写一个图书馆,在那里我允许人们提供实现的某些接口使用一个插件框架(这是JPF如果你熟悉).插件均不存在类路径。该框架给了我一个类装入器的每个插件,所以在执行名为"MyImpl"接口"MyInterface"被请求,我可以找到正确的插件,然后使用那个插件的类加载到负荷类,从中我可以让一个实例如果我知道一些关于构造。到目前为止一切顺利。

然而,现在我有一个情况下,我需要叫一个方法,该方法仅适用于特定的执行情况。因此,有两种方式我可以尝试做到这一点:

方法1:

// Makes sure that MyImpl has been loaded, using the custom classloader
Plugins.getClass(MyInterface.class, "MyImpl");
// This line will not compile because MyImpl is not available at build time
MyImpl foo = new MyImpl();
// If I could get this far, this line would work:
foo.methodOnlyInMyImpl();

方法2:

// This call will get an instance of MyImpl (already written and tested)
MyInterface foo = Plugins.getInstance(MyInterface.class, "MyImpl");
// Compiler error because there is no MyInterface.methodOnlyInMyImpl method.
foo.methodOnlyInMyImpl()

1的方法,是清洁的两个,因为它是最为相似,你会怎么写的代码如果该类是"正常的",不能通过一个插件。然而,无论是编译。

选择我已经想出了迄今为止:
A.使用的方法2,但是使用反射做methodOnlyInMyImpl方法的呼吁(请不要!)
B。将插件的类别,在建立的路径,然后使用的方法1,这将编译。(我现在最喜欢的)
C.B+当插件的安装,复制这类文件,另一个目录,该目录是在类路径,以便系统类装入器可以将它们载(引起的其他问题)

因此,我的问题是:

  1. 我失的另一个想法是更好吗?
  2. 如果我这样做,B,我会有问题,在运行时?毕竟,这类使用MyImpl会大概已经载入使用的系统类装入器。所以,只要它认为 MyImpl foo, 不它试图载MyImpl使用系统的类装载器,将失(即使插件。newInstance话将提供一个实例MyImpl)?
有帮助吗?

解决方案

第一,什么优势你从插机构的,当你需要实施对实际执行?插件应该实现一个接口,并且可以使用的实现通过该接口。

我不fimilar与JPF,但java类是永远不相容的装载时通过不同类装入器.但有两个可能的方式:

  1. 该接口在你的类装入器,插件类加载有您的类装入器作为父母,使其接口是一样的你。代码2应工作与这个,当的方法是decladed在的接口。

  2. 你可以使用电子监管.这是一个有限的方式更有用的转移数据对象之间的独立类装入器.我需要使用这个用于交叉的背景下派遣的与请求的参数之间的两web.

其他提示

有一个图书馆被称为TransLoader提到在以前的问题。这里是网址为的来源: http://code.google.com/p/transloader/ .

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top