gpt4 book ai didi

arrays - 在 GWT 中使用类对象创建新数组

转载 作者:行者123 更新时间:2023-12-01 01:30:52 25 4
gpt4 key购买 nike

我想从 GWT 中的类对象创建一个具有给定类型的新数组。

我的意思是我想模拟

java.lang.reflect.Array.newInstance(Class<?> componentClass, int size)

我需要这种情况发生的原因是我有一个偶尔需要执行以下操作的库:
Class<?> cls = array.getClass();
Class<?> cmp = cls.getComponentType();

如果我正常将数组类传递给它,这会起作用,但我无法从某个任意组件类型动态创建新数组。

我很清楚 GWT 缺乏反射(reflection);我明白这一点。然而,即使考虑到 GWT 的有限反射(reflection),这似乎也是可行的。我相信这一点的原因是在 implementation ,存在一个不可访问的静态方法来为数组创建类对象。

同样,我理解数组方法只是围绕 JavaScript 数组的类型安全包装器,因此即使需要 JSNI,也应该很容易被破解。

实际上,更重要的是获取类对象,我可以解决无法创建新数组的问题。

最佳答案

如果您对创建正确类型的种子数组很酷,您可以使用 jsni 以及一些 super super 源的知识来创建数组,而无需通过 ArrayList 进行复制(我避免了像瘟疫一样的 java.util 开销):

public static native <T> T[] newArray(T[] seed, int length)
/*-{
return @com.google.gwt.lang.Array::createFrom([Ljava/lang/Object;I)(seed, length);
}-*/;

其中 seed 是您想要的正确类型的零长度数组,length 是您想要的长度(尽管在生产模式下,数组实际上没有上限,它使 [].length 字段正常工作)。

com.google.gwt.lang 包是编译器中用于基础仿真的一组核心实用程序,可以在 gwt-dev!com/google/gwt/dev/jjs/intrinsic/com/google/gwt/中找到朗。

您只能通过 jsni 调用使用这些类,并且只能在生产 gwt 代码中使用(如果使用 GWT.isProdMode())。一般来说,如果您只访问 super 源代码中的 com.google.gwt.lang 类,则保证永远不会泄漏对仅存在于已编译 javascript 中的类的引用。
if (GWT.isProdMode()){
return newArray(seed, length);
}else{
return Array.newInstance(seed.getComponentType(), length);
}

请注意,您可能需要 super 源 java.lang.reflect.Array 类以避免 gwt 编译器错误,这表明您希望将您的 native 辅助方法放在那里。但是,我帮不了你更多,因为这会超出我的工作契约(Contract)的范围。

关于arrays - 在 GWT 中使用类对象创建新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972709/

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