java - 如何为给定 Class 子类型的数组返回 Class 实例?
问题描述
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Date;
public class Test {
public static void main(String[] args) {
System.out.println(new Test().getClassOfArrayOfSerializable(String.class));
System.out.println(new Test().getClassOfArrayOfSerializable(Date.class));
}
@SuppressWarnings("unchecked")
private Class<? extends Serializable> getClassOfArrayOfSerializable(final Class<? extends Serializable> subtypeClass) {
return (Class<Serializable>) Array.newInstance(subtypeClass, 0).getClass();
}
}
上面的方法 getClassOfArrayOfSerializable() 返回作为参数传递的类型的对象数组的类。
如您所见,即使我实际上只需要它的类,我也必须创建数组的一个实例。
有没有办法避免数组的实例化?
解决方案
事实证明,以下工作非常好(使用在线编译器测试和验证):
System.out.println(String[].class);
System.out.println(Date[].class);
产生所需的输出:
class [Ljava.lang.String;
class [Ljava.util.Date;
不需要数组的实例化——假设您事先知道需要什么类,您可以简单地请求其封装数组的类类型。
但是,如果您必须在运行时在给定的类类型上找到数组类类型,我相信您唯一的选择是使用Basin的建议(也通过在线编译器验证为工作解决方案):
Class.forName("[L" + className + ";");
作为一种方法:
@SuppressWarnings("unchecked")
private Class<? extends Serializable> getClassOfArrayOfSerializableNoArrayInitialization
(final Class<? extends Serializable> subtypeClass) throws ClassNotFoundException
{
return (Class<Serializable>) Class.forName("[L" + subtypeClass.getName() + ";");
}
推荐阅读
- facebook - 尝试登录facebook时如何解决错误的签名代码190
- c - 如何使用 GSL 库从两个复杂变量中插入一个复杂函数?
- angular - 如何修复 'ERROR TypeError: 无法读取 ANGULAR 中未定义的属性'用户名''
- ios - 为什么苹果在压缩之前对 .ipa 进行加密?
- python-3.x - 使用自定义输入训练 spacy 模型
- python - 如何限制线程池中线程的 nr 以实现无限迭代?
- assembly - 对 MIPS j 和 beq 指令使用十六进制值
- python-3.x - 如何覆盖 `TemplateView.as_view()` 并使用 ConfirmEmailView 进行电子邮件验证?
- html - 我的 svg 轮廓不完全在 svg 边缘
- java - 字符串的 charAt(0) 未返回预期值