【问题标题】:Getting Constructor from Java Class that would be called for argument types, not requiring exact argument & parameter type match从将为参数类型调用的 Java 类获取构造函数,不需要精确的参数和参数类型匹配
【发布时间】:2020-06-10 20:37:53
【问题描述】:

在 Java 中(或在 Java 库中)是否有任何方法可以从 Class 中获取 Constructor,这将为给定的参数/参数类型调用(不需要精确的参数和参数类型匹配,而是包括超类型)?

即我知道Class#getConstructor(Class<?>),但这只会返回完全匹配。

例如,下面的代码会抛出一个NoSuchMethodException,而我想为A(CharSequence) 获取Constructor,因为如果我跑了就会调用它,例如A("")

public class A {

    public A(Object o) {}
    public A(CharSequence cs) {}

    public static void main(String[] args) throws Exception {
        Constructor c = A.class.getConstructor(String.class);
        c.newInstance("");
    }
}

我想这样的方法也可能会抛出一个异常,表明多个构造函数匹配,所以如果没有更具体的参数类型(比如通过显式强制转换),它就无法选择。

我也想为Methods 找到这个功能。

谢谢。

【问题讨论】:

  • 您可以将"" 投射到您要使用的对象上。除此之外,我认为没有好的做法。
  • 您可以致电getConstructors(),然后应用您想要选择其中之一的任何逻辑。
  • @DavidConrad 同意。我也想过使用getConstructors() 来做到这一点,但是我必须学习并复制确切的Java参数到参数匹配规则,如果其他人已经这样做了,我宁愿不这样做,最好在 JRE 或常用库中。
  • @MichaelBianconi 我的问题是我有一个方法,该方法将Class 实例化& 构造函数参数作为其参数。我事先不知道Class 有哪些构造函数,哪些是参数的超类型。我需要一些代码来检查Class & 参数来解决这个问题。
  • 完成创建对象的整个任务(不仅仅是获取构造函数)的简单方法是使用java.beans.Expression。它遵循与编译器相同的类型推断规则。

标签: java reflection constructor


【解决方案1】:

您可以使用java.beans.Expression

演示行为:

public class A {
    public A(Appendable o) { System.out.println("A(Appendable)");}
    public A(CharSequence cs) { System.out.println("A(CharSequence)");}

    public static void main(String[] args) throws Exception {
        // calls A(CharSequence)
        A a1 = (A)new Expression(A.class, "new", new Object[]{ "string" }).getValue();
        // calls A(Appendable)
        A a2 = (A)new Expression(A.class, "new", new Object[]{ System.out }).getValue();
        // ambiguous, throws exception
        A a3 = (A)new Expression(
            A.class, "new", new Object[]{ new StringBuilder() }).getValue();
    }
}

请注意,当前版本并不表示问题是例外情况下的歧义;这与没有找到匹配的情况是无法区分的。

一个基本限制是无法解决歧义,因为您无法预先选择方法或构造函数。您将不得不求助于低级反射,它要求完全匹配。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多