问题已关闭。原因:代为完成个人任务。
提问需要满足:其他人可能遇到相似问题,或问题的解决方法对其他人有所助益。如果通过其他方式解决遇到困难,欢迎提问并说明你的求知过程。

谁来解释下基本类型变量的class,如int.class.什么时候会使用它们?

int有class,是否说明int其实在java中也算是一个类,只不过不支持new创建到堆,对开发者来说不是意义上的类而已.如果创建基本类型变量如int,也会用到对应的int.class吗?在JDK哪个JAR包下能找到int.class这个文件呢?最重要的,它与一般类的class在创建对象的时候生命周期,内存分配和其他方面有什么区别?
关注者
36
被浏览
4211
就一直到Java SE 8版本的Java而言:
(未来也有可能会有变化)

首先看java.lang.Class的JavaDoc:Class (Java Platform SE 8 )
Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
请特别留意最后一句。这一句所表述的意思是,作为特例,虽然Java的原始类型与void不是class或interface,但还是有对应的用于表现它们的Class对象。

所以题主的问题:
int有class,是否说明int其实在java中也算是一个类
不是。int只是有对应的java.lang.Class对象作为反射系统的一部分,以便实现反射系统的完整性。但int是一个Java的基本类型,不是一个类。
(当然我们事后评论可以认为java.lang.Class这个名字起得不好…)

如果创建基本类型变量如int,也会用到对应的int.class吗?
不会。int.class只有在反射操作时有用。例如说,对于这样的Foo.bar()方法:
class Foo {
  public int bar(int ignored) { return 42; }
}
它对应的java.lang.reflect.Method对象所报告的getReturnType()的Class对象就会是int.class所指向的那个。
而如果我们要使用反射API在Foo.class上精确查找这个bar()方法的话, 用Foo.class.getDeclaredMethod("bar", int.class) 这里也需要用int.class来指定参数类型(注意这个情况下不能用Integer.class来指定参数类型,因为那样匹配到的是 bar(Integer) 而不是 bar(int) )

在JDK哪个JAR包下能找到int.class这个文件呢?
并不存在。int.class对应的Class对象是JVM合成出来的,并不是从Class文件加载出来的。注意:int.class跟Integer.class所指向的不是同一个Class对象。

JVM的实现中,在JVM初始化的时候就会把原始类型和void对应的Class对象创建出来。这些Class对象的创建不依赖任何外部信息(例如说需要从Class文件加载的信息),不需要经历类加载过程,而纯粹是JVM的实现细节。

Java的int类型是原始类型,是值类型而不是引用类型(或者说“对象”)。使用它并不会触发任何类加载动作 ,不会调用任何构造器。它就是个简单的值,直接存储在局部变量/字段中。

顺带放个相关传送门:为什么Android的Void实现和JDK有区别? - RednaxelaFX 的回答 - 知乎