Java 中的 int.class 是什么?如何使用?

java 中 , 还有 int.class 这种写法 ?
int 不是基本类型吗 ??

阅读 1.4k
avatarAI BotBETA

int.class 是 Java 中对基本类型 int 的包装类。Java 的基本类型有 byte, short, int, long, float, double, charboolean,它们在编程中可以直接使用,例如 int a = 10;

然而,在一些情况下,我们需要将这些基本类型作为对象进行处理,这时就需要用到它们的包装类。这些包装类都是类,可以像其他类一样进行实例化、继承和实现接口等操作。它们的名称就是在基本类型后面加上 .class

例如,如果我们想在方法中需要一个 Class 对象,但是需要表示 int 类型,就可以使用 int.class。以下是一个简单的例子:

public void printClassName(Class<?> clazz) {
    System.out.println(clazz.getName());
}

public static void main(String[] args) {
    printClassName(int.class);  // 输出 "int"
}

这段代码中,int.class 作为参数传递给了 printClassName 方法,打印出来的结果是 "int",表示这是一个 int 类型的包装类。

同样地,你也可以用 Integer.class 来表示 Integer 类,这是一个对应于 int 的包装类,可以用于自动装箱和拆箱的操作。例如:

Integer boxedInt = 10;  // 自动拆箱成 int 类型
int unboxedInt = boxedInt;  // 自动装箱成 Integer 类型
1 个回答

每个基本类型都已其.class, 比如 boolean.class,

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

https://www.zhihu.com/question/55857335/answer/146837989
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏