java - 如何选择使用哪个构造函数以及Class<?>类型属于哪个类

标签 java constructor hashmap

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

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

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

  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;        
      }                
}

最佳答案

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

现在回答您的问题。 Class<?>是对未知类的引用。基本上任何类(class)。使用它时,它或多或少等于 Class<Object>因为所有类(class)都有Object作为家长。

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

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

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

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

函数newInstanace根据需要实现尽可能多的参数。因此,根据请求的构造函数需要多少参数需要 newInstance函数将能够使用它。

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

关于java - 如何选择使用哪个构造函数以及Class<?>类型属于哪个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019544/

相关文章:

java - 为什么 HashMaps 使用二的幂来实现?

Java Swing Frame 导航到另一个 Frame

java - 如何使用 libgdx assetmanager 正确加载纹理

java - 类将自身作为参数传递

c++ - 类型 ‘serial::serial’ 命名构造函数,而不是 C/C++ 中的类型

c# - 字段启动器(静态或非静态)和构造函数(静态或非静态)首先运行

java - 基于键列表获取子 HashMap 的最佳方法是什么?

java - 从 Java 应用程序监控 Tomcat 服务器

java - 查找具有给定地理点的最近 50 个项目

c - 如何理解Locality Sensitive Hashing?