gpt4 book ai didi

Java反射创建未知类的实例和构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 14:09:24 25 4
gpt4 key购买 nike

我已经在 Google 和 StackOverflow 上搜索过,但还没有找到答案..

我尝试在不知道构造函数参数类型的情况下使用构造函数按名称实例化一个类。

  1. 我知道该类的包和类名(它以字符串形式提供给方法)
  2. 我知道构造函数的参数(它们也被提供给方法,但作为对象数组)

它必须与此类似:

// ...  Load class using ClassLoader if not in classpath ...

// These are given as arguments to the function:
String pncn = "Some.Package.UnknownClass"; // packagename classname
Object[] oa =new Object[] {
"Test0",
new Random()
};///object array

Class cl = Class.forName(pncn);

Class[] ca = /* ? */;
// (Here I need to get all constructor argument classes by the objects in 'oa'

// Get the constructor with the given arg types of 'ca'
Constructor co = cl.getConstructor(ca);

//And then instantiate the class
Object ro = co.newInstance(ca) ;

/*//return it:
return ro;*/;

所以基本上问题是如何将不同类型的对象数组(示例中的“oa”)转换为 Class 数组?

我计划使用此方法通过 javascript 按名称和参数创建类的实例。

最佳答案

对于具有大量假设的简单情况:循环遍历 oa,对每个对象调用 getClass() 并使用结果填充 ca

如果你的日常工作必须更加稳健,你就必须考虑更多的情况:

  • 您必须检查null。由于 null 对于每种引用类型都是可接受的,因此您可能还必须迭代所有可能的构造函数才能找到匹配项。不保证有明确的匹配。
  • 还有基元。如果构造函数具有原始参数,您还必须检查这一点,因为您的对象数组将仅包含引用类型,因此 getClass() 将返回 java.lang.Integer 的类对象,而不是原始类型 int 的类对象 Integer.TYPE

简而言之:您必须重新实现编译器已经为静态情况所做的事情。

关于Java反射创建未知类的实例和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521127/

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