我有下面的方法可以帮助我创建一个类的实例,该类的构造函数接受一个参数。问题是我正在尝试创建一个类的实例,该类的构造函数将接口(interface)作为参数。当我调用下面的方法时,arg.getClass 解析为派生类而不是接口(interface),因此 c.getConstructor 失败并出现 NoSuchMethodException。是否可以使用反射来创建以接口(interface)作为参数的对象实例?
public static <T> T getInstance(String className, Object arg)
{
Class<?> c = Class.forName(className);
Constructor<?> ctor = c.getConstructor(arg.getClass());
return (T)ctor.newInstance(arg);
}
最佳答案
Apache Commons Lang 提供了 ConstructorUtils
具有 getMatchingAccessibleConstructor(Class, Class[])
的类查找具有匹配类类型参数的可访问构造函数的方法
例子:
public class Examples extends Object {
public static void main(String[] args) throws Exception {
Class<?> clazz = Examples.class;
Constructor<?> cons = ConstructorUtils.getMatchingAccessibleConstructor(clazz, new Class[]{B.class});
System.out.println(cons);
}
public Examples (A a) {}
interface A {}
static class B implements A {}
}
打印
public test.Examples(test.Examples$A)
您可以查看源代码并修改它,以便您可以找到所有构造函数,无论是否可访问。
关于java - 如何使用 Java 反射创建具有接受接口(interface)的构造函数的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428912/