2012-10-09 294 views
0

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

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

是否有任何明智的方法来找到给定的一组参数的正确构造函数?

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

回答

2

你是否通过Reflection API教程?它有正是你想要的实施..

+0

此外,您可以添加有关ClassLoader –

+0

的注意事项我可以处理类加载,并在过去使用过。实际上,我打算使用动态加载的大多数功能只是使用空的构造函数,然后使用初始化函数(这是更具体的应用程序),但因为它是我正在编写的库,灵活的 –

1

当您通过反射API的教程,你可以用单一的方法对您的问题

private final boolean checkConstructor(Class<?> type, Class<?>... parameterTypes) { 

     try { 
      forName.getConstructor(parameterTypes); 
      return true; 
     }catch(NoSuchMethodException e) { 

     } 

     return false; 
    } 

你必须记住的paraemterTypes的顺序是非常重要的。

您不应该在需要构造函数而不知道参数类型的地方使用sytiation。同样的规则适用于你不应该在构造函数中使用null的代码风格。

+0

你的意思是刚刚得到的类,拒绝它,如果有空(不可解析),并试图捕捉?我曾认为这是我的备份解决方案,但有兴趣知道是否有更优雅的解决方案。 –

0

getClass()是一种正确的方法。你必须遍历所有可访问的构造函数,并根据Choosing the Constructor and its Arguments的精神选择最具体的构造函数,包括如果发现0或> 1构造函数,则抛出豁免,以及如Determine Method Signature中的装箱/拆箱。由于空值,你不能直接实现这些算法,但应尽可能保持接近。

相关问题