【发布时间】:2014-09-23 22:51:03
【问题描述】:
我正在 java 中创建一个 IoC 容器,使用反射来自动实例化依赖项。我已经让它递归地工作了,但是实例化很笨拙而且不是很直观。
import java.lang.reflect.Constructor;
import java.util.ArrayList;
public class IoC {
public void register(Object type)
{
}
public Object resolve(String type) throws Exception {
// Get class
Class c = Class.forName(type);
// Get class constructors
Constructor[] constructors = c.getConstructors();
if (constructors.length > 1) {
throw new Exception(type + " has more than one constructor. Can't auto instantiate!");
}
// The one constructor
Constructor constructor = constructors[0];
// Get constructor parameter types
Class[] parameters = constructor.getParameterTypes();
// ArrayList to hold dependencies
Object[] dependencies = new Object[parameters.length];
if (parameters.length > 0) {
// Get dependencies recursively
for (int i = 0; i < parameters.length; i++) {
dependencies[i] = resolve( parameters[i].getName() );
}
}
if(dependencies.length > 4)
{
throw new Exception("Too many dependencies, consider refactoring!");
}
else if(dependencies.length == 1) {
return constructor.newInstance(dependencies[0]);
}
else if(dependencies.length == 2) {
return constructor.newInstance(dependencies[0], dependencies[1]);
}
else if(dependencies.length == 3) {
return constructor.newInstance(dependencies[0], dependencies[1], dependencies[2]);
}
else if(dependencies.length == 4) {
return constructor.newInstance(dependencies[0], dependencies[1], dependencies[2], dependencies[3]);
}
return constructor.newInstance();
}
}
如你所见,我正在做的是检查依赖数组的长度,然后传入相应数量的参数。
所以我要问的是,有没有办法在实例化时只传入依赖数组,并且数组元素会自动作为单独的参数传递?
希望它有意义:)
【问题讨论】:
标签: java reflection ioc-container instantiation