java - 如何使用 Java 反射创建具有接受接口(interface)的构造函数的实例?

标签 java

我有下面的方法可以帮助我创建一个类的实例,该类的构造函数接受一个参数。问题是我正在尝试创建一个类的实例,该类的构造函数将接口(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/

相关文章:

java - 将数组转换为ArrayList

java - 元音检查 - 数组越界错误

java - JAXB 解码

Java:wait() 将 fps 限制为 64

java - 在 Java 中使用 File 类时的 SonarQube 漏洞

java - Mockito/PowerMockito 模拟私有(private)工厂方法

java - 用双反斜杠替换反斜杠

java - 显示按下的 Jbutton 的行和列

java - 如何在java中仅使用数字或仅使用字符生成MD5哈希

java - 为什么响应实体返回带有 setter/getter 名称而不是数据成员名称的 json