【问题标题】:How to choose which constructor to use and what class does the Class<?> type belongs to如何选择使用哪个构造函数以及 Class<?> 类型属于哪个类
【发布时间】:2012-04-04 21:30:41
【问题描述】:

我有一个类,其中我在静态块中初始化了 hashmap。通过密钥,我检索了一个类的值。为了为这个类创建对象。我已经使用构造函数类来获取构造函数并传递参数和创建的对象。

我在 hashmap 中有两个类。要为 EchoExpression 创建对象,我需要传递两个参数,而对于 OutExpression 类,我只需要传递一个参数(字符串)。

  1. 根据key返回的类,我需要执行获取和实现哪个构造函数,是一个参数还是两个参数的构造函数。

  2. 在 EchoExpression 中,构造函数包含两个参数。

例如:

JXPathExpression check = new JXPathExpression(String expression, Class<?> type)

String 属于 String.class 但 Class 类型参数也属于什么类?这样我就可以使用它来获取构造函数

public class ExampleFactory {

    private static HashMap<String,Class<?>> hmap = new HashMap<String,Class<?>>();

    static
    {                   
        hmap.put("echo", EchoExpression.class);         
        hmap.put("Out", OutExpression.class);                       
    }

    public void getExpo(String key,String expression)
      {
        Class aClass =map.get(key);

//Constructor implementation for OutExpression where only one argument string is passed

        Constructor constructor = aClass.getConstructor(new Class[]{String.class});

        Object object= constructor.newInstance(expression);

//Need constructor for passing two arguments string and class<?> for EchoExpression

        return null;        
      }                
}

【问题讨论】:

    标签: java constructor hashmap


    【解决方案1】:

    对于这样的事情,您应该在所有情况下尝试使用统一的构造函数参数或存储每个类的参数的方法。

    现在回答您的问题。 Class&lt;?&gt; 是对未知类的引用。基本上到任何班级。使用它时,它或多或少等于Class&lt;Object&gt;,因为所有类都以Object 作为父类。

    要使用具有多个参数的构造函数,您首先需要获取合适的构造函数。在这一点上,如果类不支持具有这种参数配置的实例,它已经可以获取发生的错误。 获取构造函数是这样工作的:

    aClass.getConstructor(new Class[]{String.class, Object.class, ...});

    这适用于您喜欢的任意数量的参数类型。然后以这种方式创建类的新实例:

    constructor.newInstance(theString, theObject, ...);

    函数newInstanace 实现了所需的多个参数。因此,取决于所请求的构造函数需要多少个参数,newInstance 函数将能够使用它。

    对于所有你想要的......也许是一个建议:也许它是一个选项,不使用反射加载新对象,而是通过存储这些对象的实例并返回使用复制构造函数创建的对象的副本或 clone方法。在许多情况下,这不太难运行。

    【讨论】:

    • 嗨实际上 class> 类型是指在我的情况下类的返回类型。例如:class> 类型的值 --> Boolean.class
    • Object.class 不适合我。你能用一些例子来解释你的提议吗
    • 对于返回类型,您必须使用Class&lt;?&gt;,因为这基本上表示“任何类类型”。表示对任何类的类引用,没有设置限制。其他一切都需要明确的演员表。
    【解决方案2】:

    也许您正在寻找的是 Class.class,例如:

    Constructor constructor = aClass.getConstructor(new Class[]{String.class, Class.class});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-30
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多