gpt4 book ai didi

java - 在运行时获取数组类名的安全方法是什么?

转载 作者:行者123 更新时间:2023-11-29 03:31:34 26 4
gpt4 key购买 nike

下面是一个示例代码,需要获取运行时未知的数组的类名:

//for calling methods declared similar to
// void method(String... values);
//For primitive type we have other overloads and the following
//is generic for classes

@SuppressWarnings("unchecked")
private static <T> void invokeVaridic(Method m, Object host, T... values)
throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, ClassNotFoundException{

assert(values.length>0); //We assume all users passes at least one value
Class<? extends T[]> c = (Class<? extends T[]>)
Class.forName("[L" + values[0].getClass().getName() + ";");
m.invoke(host, Arrays.copyOf(values, values.length,c));
}

由于类型删除的本质,values 的类型实际上是 Object[],我不能将其传递给 m.invoke,因为它需要字符串[]。但是,因为我强制用户传递至少一个值,所以我可以使用 values[0] 的类型来构造一个新数组。

我不知道 T[].class 是什么。

我想出了上面的代码,它取决于字节代码中数组名称的解释,但它安全吗?获取 T[].class 的建议方法是什么?

最佳答案

valuesT[] 类型:

Class<? extends T[]> arrayType = (Class<? extends T[]>) values.getClass();
Class<? extends T> component = (Class<? extends T>) values.getClass().getComponent();

/编辑

完整示例:

public class GenericArray {
public static void main(String[] args) {
foo("", "");
}

@SafeVarargs
public static <T> void foo(T... args) {
Class<? extends T[]> array = (Class<? extends T[]>) args.getClass();
Class<? extends T> component = (Class<? extends T>) array.getComponentType();
System.out.println(array);
System.out.println(component);
}
}

使用 JDK 1.7.0_25 打印以下内容

class [Ljava.lang.String;
class java.lang.String

关于java - 在运行时获取数组类名的安全方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17962516/

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