如果代码调用new int[0][0],条目[[I将被放入常量池表中。对于更高维的数组,将放置类似的条目。
但是,如果代码调用 new int[0],常量池表中将不会出现任何条目,就像 int 类型不会出现任何条目一样。
同样有趣的是,如果代码调用 new String[0][0],则“[[java/lang/String;”添加到常量池表中,但是如果代码调用 new String() 或 new String[0],则只有“java/lang/String”被添加到常量池表中(第二种情况下没有 [ 或 ; ) .
假设我的代码和commons的BCEL API都正确解析了池表,为什么常量池表中没有列出一维数组类型?
最佳答案
有多种指令可用于创建数组:newarray
、anewarray
和 multinewarray
。
newarray 创建一个单维原始数组,不需要任何常量池条目。
anewarray 接受一个类型并创建一个包含该类型元素的数组,并初始化为 null。
multinewarray 接受要创建的数组的类型,并自动用子数组填充元素。这使您可以使用一条指令创建多维数组。
其中,只有最后一个需要带有要创建的数组类型的 cp 条目。对于标准编译器,new int[x]
使用第一个,new String[x]
使用第二个,new int[x][y]
或 new String[x][y]
使用第三个。
关于java - 为什么.class文件的常量池表中没有列出一维数组类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927261/