【发布时间】:2020-07-13 13:59:30
【问题描述】:
我需要在 Java 中创建一个数组的类名。我注意到当使用反射查看类名时,数组具有某种模式:
例如对于 com.foo.Thing 数组的数组
[[Lcom.foo.Thing;
创建这个类名的公式是什么?我认为除“L”之外的其他字母表示不同的意思。有没有图书馆可以帮助解决这个问题?
【问题讨论】:
-
括号表示尺寸(2D),
L表示它是一个对象数组,然后你就得到了类型。
我需要在 Java 中创建一个数组的类名。我注意到当使用反射查看类名时,数组具有某种模式:
例如对于 com.foo.Thing 数组的数组
[[Lcom.foo.Thing;
创建这个类名的公式是什么?我认为除“L”之外的其他字母表示不同的意思。有没有图书馆可以帮助解决这个问题?
【问题讨论】:
L 表示它是一个对象数组,然后你就得到了类型。
每个基元一个字母,一个数组一个符号,一个参考字母:
I = intJ = 长D = 双F = 浮动Z = 布尔值C = 字符B = 字节S = 短Lcom/foo/Thing; = 参考 'com.foo.Thing'[ = 接下来的数组(因此,[[I 是 int[][])。这是用于类型签名的 VM 语言。例如,签名:
public boolean[] foo(String[] args, int count) { ... }
是:([Ljava/lang/String;I)[Z。
它适用于机器而不是人类;它很容易解析(您只需前进,无需向前看)。
这不是事物的“类名”;此构造的常用名称是“vm name”。请注意,泛型只是从这些中消失; List<String> 的 VM 名称是 Ljava/util/List;。这就是为什么如果删除所有泛型,这两个方法最终具有相同的名称、参数类型和返回类型,则不能覆盖方法的原因。
【讨论】: