这是一个通用解决方案,不需要javassist或其他字节码“操纵器”。虽然,它假设构造函数除了简单地将参数分配给相应的字段之外没有做任何其他事情,因此它只是选择第一个构造函数并创建一个具有默认值的实例(即int为0,Object为n null等)。
private <T> T instantiate(Class<T> cls, Map<String, ? extends Object> args) throws Exception
{
// Create instance of the given class
final Constructor<T> constr = (Constructor<T>) cls.getConstructors()[0];
final List<Object> params = new ArrayList<Object>();
for (Class<?> pType : constr.getParameterTypes())
{
params.add((pType.isPrimitive()) ? ClassUtils.primitiveToWrapper(pType).newInstance() : null);
}
final T instance = constr.newInstance(params.toArray());
// Set separate fields
for (Map.Entry<String, ? extends Object> arg : args.entrySet()) {
Field f = cls.getDeclaredField(arg.getKey());
f.setAccessible(true);
f.set(instance, arg.getValue());
}
return instance;
}
P.S. 适用于 Java 1.5+。该解决方案还假定没有可以阻止调用 的 SecurityManager 管理器。f.setAccessible(true)