当前位置: 首页 > 知识库问答 >
问题:

数组类型的Java get类

闾丘玮
2023-03-14
  • 是否同时初始化一个空数组?
  • 此空数组是否缓存在JVM中?
  • 它们对某个数组-类-对象进行操作吗?
  • 它们在字节码级别上相同吗?

注意:它可能是以某种方式写在JLS中的,但我在任何地方都找不到合适的描述。

共有1个答案

穆宏胜
2023-03-14

表达式new string[0].getClass()直接编译为指令以创建新数组,然后调用getClass()的方法。相反,类文本string[].class被编译为一个LDC指令,如“类文本如何编译为Java字节码?”中所述。

您可以通过运行以下程序来验证这一点

package jvm;

import javax.tools.ToolProvider;

public class GetArrayClass {
    public static Class<?> viaGetClass() {
        return new String[0].getClass();
    }
    public static Class<?> viaClassLiteral() {
        return String[].class;
    }
    public static void main(String[] args) {
        decompile();
    }
    private static void decompile() {
        Object args = new String[]{"-c", GetArrayClass.class.getName()};
        try {
            ToolProvider.getSystemJavaCompiler().getClass().getClassLoader()
                .loadClass("com.sun.tools.javap.Main")
                .getMethod("main", String[].class).invoke(null, args);
        } catch(ReflectiveOperationException ex) {
            throw new IllegalStateException(ex);
        }
    }
    private GetArrayClass(){}
}

Ideone演示

public static java.lang.Class<?> viaGetClass();
    Code:
       0: iconst_0
       1: anewarray     #1                  // class java/lang/String
       4: invokevirtual #2                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
       7: areturn

public static java.lang.Class<?> viaClassLiteral();
    Code:
       0: ldc           #3                  // class "[Ljava/lang/String;"
       2: areturn
 类似资料:
  • 问题内容: 我正在尝试创建一个泛型类型的数组。我收到错误消息: 我很困惑。任何线索为什么会这样。 问题答案: 其背后的原因是,您不能创建通用或参数化类型的数组,而只能 创建可验证的 类型(即可以在运行时推断出的类型)。 尽管可以将此类数组类型 声明 为变量或方法参数。这有点不合逻辑,但这就是Java的样子。 Java泛型和集合在第6章中广泛讨论了此问题和相关问题。

  • 我正在努力弄清楚是否可以在TypeScript中声明一个静态类型的函数数组。 例如,我可以这样做: 但是,如果我想让foo成为一个函数数组,它接受一个字符串而不返回任何内容,我该怎么做呢? 不起作用,因为TypeScript认为它是一个接受字符串并返回空数组的函数,而且它似乎不喜欢我试图将函数包装在括号中。 有什么想法吗? 答:感谢下面的穆罕默德,这里有一个在TypeScript游戏场中工作的示例

  • 问题内容: 我正在处理阵列,需要一些帮助。我想创建一个数组,其中第一个字段是String类型,第二个字段是Integer类型。对于结果: 调出 问题答案: 数组只能具有单个类型。您可以创建一个新类,例如: 您可能还对使用地图感兴趣(在我看来,您好像正在尝试将字符串映射到ID)。 编辑:您还可以定义类型的对象数组,但这是我通常会避免的事情。

  • 问题内容: 我最近开始学习JAVA泛型。一切都说得通,我现在有点理解。但是有一件事让我烦恼-您无法创建通用类型的数组。 我想实现诸如队列和堆栈之类的抽象数据类型,但是要使用某种通用类型作为存储在堆栈中的基础数据。我将如何解决?我确定我想念但那是什么? 提前致谢。 问题答案: 《有效的Java》,第5章,GENERICS,第25项:首选列表而不是数组 : 数组在两个重要方面不同于通用类型。首先,数组

  • 数组是一组包含相同数据类型 T 的组合,并存储在连续的内存区中。数组使用中括号 [] 来创建, 另外它们的大小在编译期间就已确定,数组的类型标记为 [T; size](译注:T 为元素的类型,size 表示数组的大小)。 slice(中文有“切片”之意) 类型和数组类似,但 slice 类型的大小在编译期间是不确定的。相反, slice 是一个双字对象(two-word object),第一个字是

  • 问题内容: 我在弄清楚以下RHS中期望使用什么类型参数时遇到问题 为什么副本不合法? 问题答案: 具体参数化类型的数组固有地被破坏。请记住,数组是协变的,数组类型检查是运行时操作。在运行时,所有泛型都已被擦除,因此Array Store检查无法从中分辨出来。 泛型的基本约定是:“我,编译器,保证如果编写的代码不生成警告,则在运行时永远不会得到类强制转换异常。” 编译器也不能向您保证,如果在数组中放