在Java中动态加载类和包的最佳方法
问题描述:
我有一个工厂类,用于创建某种类型的对象(比如MyClass
)。在Java中动态加载类和包的最佳方法
工厂类属于特定的包,我想动态地在该包中的实现和新版本之间切换,以用于测试目的。
举例来说,说明原包装为pack1
,而较新版本为pack2
,其类别名称为pack1.Factory
和pack2.Factory
。可以通过属性文件中的简单参数来指定pack1
或pack2
的选择。此外,MyClass
类型对于这两个包都很常见,并且只应使用普通的香草Java(即不包含第三方库)。
我想用Class.forName()
加载pack1.Factory
或pack2.Factory
(取决于指定的属性),然后通过反射调用所有工厂方法。
这是最好的方法吗?
答
这几乎是一个注入控制的经典用例。 Guice应该让你立即开始。
有一个需要有一个接口,如IFactory
,与一些工厂方法create
。创建两个Guice模块 - 一个绑定IFactory
到pack1.Factory
,另一个绑定到pack2.Factory
。当然,这两个工厂都应该实施IFactory
。
然后在主要方法中处理您的参数,该参数确定应使用哪个工厂,并分别根据其中一个模块创建喷油器。
答
你应该尽可能避免反思。它使你的代码更难理解,难以重构和难以维护。
相反,你可以让你的工厂类实现一个接口,创建一个你想测试的工厂实例并用这个实例调用你的测试。
我不同意。反思,如果认真使用,是好的。我认为在这里使用它会很合适。 – ControlAltDel 2012-04-25 18:59:23