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()方法返回作为参数传递的类型的对象数组的类。
如您所见,即使我实际上只需要数组的类,我也必须创建该数组的实例。
有没有办法避免实例化数组?
答案 0 :(得分:1)
事实证明,以下方法效果很好(使用online compiler进行了测试和验证):
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() + ";");
}