12

我最近了解到JVM 中有基本类型的表示。例如,int.classdouble.class,甚至是void.class

我不明白为什么会有这些。它们似乎没有任何功能性作用。使用反射,我搜索了类,它们没有构造函数、方法和字段。出于所有意图和目的,它们似乎是空的和无用的。原始类型变量甚至不是它们各自类的实例,如以下返回 false 所示:

int a = 3;
int.class.isInstance(a);

那么它们为什么存在呢?它们必须服务于某种目的,也许是为了编译器或其他东西,但无论它是什么,都完全超出了我的范围。int.classInteger API中甚至有一个明确的引用(对于每个原始类型及其各自的包装对象也是如此)。我在 JLS 中找不到任何关于它们存在的参考,更不用说它们的使用了。

4

2 回答 2

12

我不明白为什么会有这些。

考虑以下:

public int foo() {
    return 0;
}

...

Method method = someClass.getDeclaredMethod("foo");
Class<?> clazz = method.getReturnType();

如果没有 的Class表示int,上面会返回什么?它不应该返回Integer.class,因为它们不是同一件事。(想象一下,试图区分被重载的方法,一个带有一个参数int,一个带有一个Integer参数。)

我以前使用这些类在通过反射调用它们时为参数提供默认值。根据参数类型,我使用null了任何引用类型,以及每个原始类型的一些(显然是装箱的)原始值。

于 2012-11-02T14:24:30.893 回答
2

这是一个廉价的解决方案,结果很糟糕。

在 1.5 之前,Java 类型可以分类为

java type
    primitive type
    reference type
        class type (including interface)
        array type

那么理想情况下,java 反射应该提供 5 个概念来反映这 5 种类型。但是他们用一个单一Class的来表示它们,包括原始类型和数组类型。所以 aClass并不一定意味着一个类。

那还是可控的。但是在 1.5 之后,Java 类型变得更加复杂,所以Type引入了一个新的。不幸的是,他们决定创建Class一个Type;的子类型,而不是直接反映语言规范的新的和干净的层次结构。不仅旧的混乱被带入,它还产生了一些新的混乱,整个Type层次结构令人费解。

于 2012-11-02T15:14:51.200 回答