具有数组类型的 getClass 方法 Java

Posted

技术标签:

【中文标题】具有数组类型的 getClass 方法 Java【英文标题】:getClass method Java with array types 【发布时间】:2011-10-15 13:52:56 【问题描述】:

所以我遇到了一些奇怪的事情,我不知道它叫什么,所以我很难找到有关它的信息,因此我的问题在这里。

我遇到了一个问题,如果您创建任何类型的数组并在 Java 中对该数组调用 getClass,您将得到一个奇怪的返回。我想知道为什么你会得到这个特定的回报,这意味着什么。

代码示例如下:

byte[] me = new byte[1];
int[] me2 = new int[1];
double[] me3 = new double[1];
float[] me4 = new float[1];
String[] me5 = new String[1];
Integer[] me6 = new Integer[1];

System.out.println(me.getClass());                  
System.out.println(me2.getClass());                 
System.out.println(me3.getClass());                 
System.out.println(me4.getClass());                 
System.out.println(me5.getClass());
System.out.println(me6.getClass());

输出是:

 class [B
 class [I
 class [D
 class [F
 class [Ljava.lang.String;
 class [Ljava.lang.Integer;

【问题讨论】:

【参考方案1】:

Class的toString方法调用Class的getName方法

返回实体的名称(类、接口、数组类、 此 Class 对象表示的原始类型或 void)作为 细绳。如果此类对象表示的引用类型不是 数组类型,然后返回类的二进制名称,如 由 Java™ 语言规范指定。

如果此类对象表示原始类型或 void,则 返回的名称是一个等于 Java 语言关键字的字符串 对应于原始类型或void。

如果这个类对象代表一个数组类,那么内部 名称的形式由前面的元素类型的名称组成 一个或多个 '[' 字符表示数组的深度 嵌套。元素类型名称的编码如下:

元素类型编码 布尔 Z 字节 B 字符 C 类或接口 L类名; 双D 浮动 F 诠释我 长J 短裤

类或接口名classname是类的二进制名 上面指定的。

例子:

 String.class.getName()
     returns "java.lang.String"
 byte.class.getName()
     returns "byte"
 (new Object[3]).getClass().getName()
     returns "[Ljava.lang.Object;"
 (new int[3][4][5][6][7][8][9]).getClass().getName()
     returns "[[[[[[[I"

【讨论】:

【参考方案2】:

类名开头的[ 应读作“...的数组”,“...”是[ 后面的内容; @emory 引用并链接到的 Class.getName() 的文档中详细说明了以下内容的约定。

Section 4.3.1 of the Java Language Specification 开始:“对象是类实例或数组。”这表明数组不是类实例。 (也许这就是@TigerTrussell 在他的回答中得到的。)但是,Section 10.8 开始:“每个数组都有一个关联的 Class 对象,与具有相同组件类型的所有其他数组共享。数组类型的直接超类是目的。”这表明数组,即使不是真正的类实例,也非常接近。

不幸的是,Java 的语法规则禁止从数组类型继承:

public class MyFancyArray extends int[]  // ILLEGAL
   // ...

请注意,这是一个语法约束;没有概念或语义障碍(许多其他 OO 语言都允许这样做)。

【讨论】:

【参考方案3】:

这只是一些愚蠢的命名约定。如果它们更具人类可读性会更好:class byte[]class java.lang.Integert[][]

【讨论】:

【参考方案4】:

这些是基础类型对象的名称。 [ 表示它是一个数组,后面的字母表示数组类型。 B=byte、I=integer、D=double 等。如您所见,“L”用于类类型成员。

【讨论】:

【参考方案5】:

数组没有类,它们只是数据结构。唯一拥有类的东西是从包含在数组中的 Object 扩展而来的东西。

【讨论】:

对不起——你得到奇怪输出的原因是Java组织其数据结构的底层方式。字母对应数据类型,前面的'['表示是数组。 数组绝对是对象。例如,这样做非常有意义:int[] a = new int[3]; System.out.println(a.getClass().getName()); 这取决于你的观点。说int[].class是完全合法的。 我不同意。如果数组没有类,那么 Class 方法是否有一个 isArray 方法,该方法确定此 Class 对象是否表示数组类。 -- download.oracle.com/javase/1,5.0/docs/api/java/lang/… @TigerTrussell - 谁说你必须是一个对象才能上课? int 不是正确的对象(尽管有自动装箱),但它仍然有一个类。如果你想了解它的技术,每个对象(和基元)只是一个为给定类型分配的连续内存块。

以上是关于具有数组类型的 getClass 方法 Java的主要内容,如果未能解决你的问题,请参考以下文章

Java反射中的getClass()方法

java getClass()

反射, getClass(), 和something.class以及类型类(转)

JAVA怎样判断一个对象的类型

java 泛型 T的类型

Java中9大内置基本数据类型Class实例和数组的Class实例