动态加载Java接口的实现

Pim*_*kos 0 java reflection classloader

我正在寻找类似于.NET托管扩展框架(http://mef.codeplex.com/)的Java功能。对于那些不了解MEF的人,我想要这样的东西:

给定接口

public interface IFoo {
 ...
}    
Run Code Online (Sandbox Code Playgroud)

通过查看已加载的jar,动态加载接口的实现。

IFoo foo = loadClassThatImplementsInterface<IFoo>();
Run Code Online (Sandbox Code Playgroud)

关键是程序员在代码时不知道实现的名称,但在代码中提供了扩展点。

在Java中根本不可能吗?我发现一些Google命中说这是不可能的,但这似乎有点...是吗?

当在编译时知道实现的完全限定名称时,有许多使用类加载器的示例。那不是我想要的。

Alo*_*ard 5

在“纯” Java中,您可以使用ServiceLoader:http : //download.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html

您只需在扩展jar中提供元数据,该数据既智能又易于扩展。

或者寻找像Guice或Spring这样的DI框架...