在Java中动态加载类和包的最佳方法

问题描述:

我有一个工厂类,用于创建某种类型的对象(比如MyClass)。在Java中动态加载类和包的最佳方法

工厂类属于特定的包,我想动态地在该包中的实现和新版本之间切换,以用于测试目的。

举例来说,说明原包装为pack1,而较新版本为pack2,其类别名称为pack1.Factorypack2.Factory。可以通过属性文件中的简单参数来指定pack1pack2的选择。此外,MyClass类型对于这两个包都很常见,并且只应使用普通的香草Java(即不包含第三方库)。

我想用Class.forName()加载pack1.Factorypack2.Factory(取决于指定的属性),然后通过反射调用所有工厂方法。

这是最好的方法吗?

这几乎是一个注入控制的经典用例。 Guice应该让你立即开始。

有一个需要有一个接口,如IFactory,与一些工厂方法create。创建两个Guice模块 - 一个绑定IFactorypack1.Factory,另一个绑定到pack2.Factory。当然,这两个工厂都应该实施IFactory

然后在主要方法中处理您的参数,该参数确定应使用哪个工厂,并分别根据其中一个模块创建喷油器。

你应该尽可能避免反思。它使你的代码更难理解,难以重构和难以维护。

相反,你可以让你的工厂类实现一个接口,创建一个你想测试的工厂实例并用这个实例调用你的测试。

+0

我不同意。反思,如果认真使用,是好的。我认为在这里使用它会很合适。 – ControlAltDel 2012-04-25 18:59:23