gpt4 book ai didi

java - 使用反射进行类注册

转载 作者:行者123 更新时间:2023-12-02 02:12:21 24 4
gpt4 key购买 nike

我正在学习工厂模式并且我正在使用 THIS文章作为来源。其中有这样一段代码:

class ProductFactory {
private HashMap m_RegisteredProducts = new HashMap();

public void registerProduct (String productID, Class productClass) {
m_RegisteredProducts.put(productID, productClass);
}

public Product createProduct(String productID) {
Class productClass = (Class)m_RegisteredProducts.get(productID);
Constructor productConstructor = cClass.getDeclaredConstructor(new Class[] { String.class });
return (Product)productConstructor.newInstance(new Object[] { });
}
}

我很难弄清楚如何createProduct()方法有效。当我尝试使用此代码时,我得到 Non-static method `getDeclaredConstructor(java.lang.Class<?>...)' cannot be referenced from a static context错误。 productClass变量已声明但从未使用过,因此代码显然有问题,但我无法弄清楚到底是什么。我检查了类似的问题,但不知道如何针对这种情况重新调整它们的用途。反射(reflection)对我来说是一个非常令人困惑的主题。

我的问题:

  1. 这段代码有什么问题?
  2. 为什么会通过new Class[] { String.class }getDeclaredConstrutor()方法及其含义是什么?
  3. 为什么要在 newInstance() 中传递对象数组而不仅仅是单个对象?

最佳答案

问题 1

这段代码有几个问题。

  1. 它只是无法编译,因为 cClass成员失踪。按理来说,应该是productClass.getDeclaredConstructor相反。

  2. 原始 HashMap使用而不是通用类型 Map<String, Class<? extends Product>> 。还有 Class 的原始类型和Constructor .

  3. 命名m_RegisteredProducts不尊重 Java 命名约定。

问题 2

new Class[] { String.class } arg 旨在使用单个 String 检索构造函数arg,例如public Product(String id) .

只需

就可以检索它
productClass.getDeclaredConstructor(String.class);

因为不强制为可变参数创建数组。

问题 3

这个数组 arg 看起来像是一个错误。使用 String 检索构造函数实例。 arg,但它传递了其他东西来实例化它。所以不可避免地会抛出异常。

结论

这个例子以及文章本身可能有太多错误或不准确的地方。我建议选择另一个。

关于java - 使用反射进行类注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49815226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com