1-1、R大:基本类型变量的class

转载自知乎R大:谁来解释下基本类型变量的class,如int.class.什么时候会使用它们?

1、java8中java.lang.Class的JavaDoc

  • 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对象。

2、int有class,是否说明int其实在java中也算是一个类?

  • int不是一个类。int只是有对应的java.lang.Class对象作为反射系统的一部分,以便实现反射系统的完整性。但int是一个Java的基本类型,不是一个类。

3、如果创建基本类型变量如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))。

4、在JDK哪个JAR包下能找到int.class这个文件呢?

  • 并不存在。int.class对应的Class对象是JVM合成出来的,并不是从Class文件加载出来的。注意:int.class跟Integer.class所指向的不是同一个Class对象。
  • JVM的实现中,在JVM初始化的时候就会把原始类型和void对应的Class对象创建出来。这些Class对象的创建不依赖任何外部信息(例如说需要从Class文件加载的信息),不需要经历类加载过程,而纯粹是JVM的实现细节。
  • Java的int类型是原始类型,是值类型而不是引用类型(或者说“对象”)。使用它并不会触发任何类加载动作 ,不会调用任何构造器。它就是个简单的值,直接存储在局部变量/字段中。

你可能感兴趣的:(1-1、R大:基本类型变量的class)