about java: get `String[].class` from `String.class`, what if `String.class` is a "runtime type"?
29,532
Solution 1
Maybe try Class.forName(String)
?
Edit: Here is a code snippet.
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);
Solution 2
HRgiger's answer improved:
@SuppressWarnings("unchecked")
static <T> Class<? extends T[]> getArrayClass(Class<T> clazz) {
return (Class<? extends T[]>) Array.newInstance(clazz, 0).getClass();
}
Both of them instantiate an array object when invoked. To get the array type, use
Class<?> childType = ...;
Class<?> arrayType = getArrayClass(childType);
Solution 3
Another trick I found is using varargs on util method.
public static void main(String[] args) throws ClassNotFoundException {
Class<?> demo = Main.<String>getArrayClass();
System.out.println(demo);
}
static <T> Class getArrayClass(T... param){
return param.getClass();
}
Author by
watchzerg
Updated on September 30, 2020Comments
-
watchzerg over 3 years
Here is a variable
Class<?> cls
, now I want to get anotherArray Class Object
which component type iscls
.For example, if
cls
=String.class
, I want to getString[].class
; ifcls
=int.class
, I want to getint[].class
, what should I do?You see, It's quite easy to get
String.class
fromString[].class
:Class<?> arrayCls = String[].class; if(arrayCls.isArray()){ Class<?> cls = arrayCls.getComponentType(); }
But I cannot find easy way to do the reverse.
Here is one possible solution:
Class<?> clazz = String.class; Class<?> arrayClass = Array.newInstance(clazz,0).getClass();
Is there any batter way to do this please?