【问题标题】:Constructors: get type list from argument list构造函数:从参数列表中获取类型列表
【发布时间】:2012-09-29 16:53:50
【问题描述】:

我目前正在开发一个程序,我将在运行时动态加载类,并正在构建一个函数库来支持它。其中一个函数是一种方法,可以轻松地在给定的 jar 文件中搜索给定的类名,并根据给定的初始化参数集创建一个新实例。

问题在于争论。我知道如何为一组类类型找到一个类的构造函数,但是,试图找到一个接受参数列表的构造函数更难。我的第一个想法是遍历参数并在每个参数上调用 getClass(),但是对于某些构造函数来说可能是有效的 null 参数呢?

有什么合理的方法可以为给定的一组参数找到正确的构造函数吗?

注意:仅限标准 Java,这是一个联合项目,因此 Java 派生语言和第 3 方库不可用。

【问题讨论】:

    标签: java constructor arguments


    【解决方案1】:

    你看过Reflection API教程吗??它有你想要的实现..

    【讨论】:

    • 另外你可以添加关于 ClassLoader 的注释
    • 我可以处理类加载,并且过去使用过。实际上,我打算使用动态加载执行的大多数函数将只使用空构造函数,然后使用初始化函数(更特定于应用程序),但由于它是我目前正在编写的库,我正在尝试保留它灵活
    【解决方案2】:

    通过反射 API 教程后,您可以使用单一方法解决您的问题

    private final boolean checkConstructor(Class<?> type, Class<?>... parameterTypes)  {
    
            try {
                 forName.getConstructor(parameterTypes);
                 return true;
            }catch(NoSuchMethodException e) {
    
            }
    
            return false;
        }
    

    您必须记住paraemterTypes 的顺序很重要。

    您不应该在调用不知道参数类型的构造函数的情况下进行关联。同样的规则也适用于你不应该在构造函数中使用 null 的代码风格。

    【讨论】:

    • 你的意思是只获取类,如果有空值(不可解析)则拒绝它并尝试捕获?我曾考虑将其作为我的备份解决方案,但想知道是否有更优雅的解决方案。
    【解决方案3】:

    getClass() 是一种正确的方法。您必须遍历所有可访问的构造函数并根据Choosing the Constructor and its Arguments 的精神选择最具体的构造函数,包括在找到 0 或 >1 个构造函数时抛出异常,以及在Determine Method Signature 中进行装箱/拆箱。由于空值,您无法从字面上实现该算法,但应尽可能接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多