关于java:从`String.class`得到`String .class`,如果`String.class`是“运行时类型”怎么办?
这是一个变量Class cls
,现在我想获得另一个组件类型为cls
Array Class Object
。
例如,如果cls
= String.class
,我想得到String[].class
; 如果cls
= int.class
,我想得到int[].class
,我该怎么办?
你看,从String[].class
获取String.class
非常容易String[].class
:
Class arrayCls = String[].class; if(arrayCls.isArray()){ Class cls = arrayCls.getComponentType(); }
但我找不到简单的方法来做相反的事情。
这是一个可能的解决方案:
Class clazz = String.class; Class arrayClass = Array.newInstance(clazz,0).getClass();
请问有什么方法可以做到这一点吗?
也许尝试Class.forName(String)
?
编辑:这是一段代码片段。
Class> arrayClass = String[].class; System.out.println(arrayClass); Class> namedClass = Class.forName("[L" + String.class.getName() + ";"); System.out.println(namedClass); System.out.println(arrayClass == namedClass);
HRgiger的答案有所改善:
@SuppressWarnings("unchecked") static Class extends T[]> getArrayClass(Class clazz) { return (Class extends T[]>) Array.newInstance(clazz, 0).getClass(); }
它们都在调用时实例化一个数组对象。 要获取arrays类型,请使用
Class> childType = ...; Class> arrayType = getArrayClass(childType);
我发现的另一个技巧是在util方法上使用varargs。
public static void main(String[] args) throws ClassNotFoundException { Class> demo = Main.getArrayClass(); System.out.println(demo); } static Class getArrayClass(T... param){ return param.getClass(); }