Java 如何在基元类型上使用.class?

Java 如何在基元类型上使用.class?,java,class,primitive,Java,Class,Primitive,当我们说 Class c = Integer.class; System.out.println(c); 它打印 class java.lang.Integer 这很有意义,因为java.lang.Integer是一个类。因此我们可以有一个相应的类对象 但当我这么做的时候 Class c1 = int.class; System.out.println(c1); 它打印int,我觉得这有点模棱两可,因为。class返回类型为class的对象,int不是类(而是基元类型) 当不存在这样的类(p

当我们说

Class c = Integer.class;
System.out.println(c);
它打印

class java.lang.Integer

这很有意义,因为
java.lang.Integer
是一个类。因此我们可以有一个相应的
对象

但当我这么做的时候

Class c1 = int.class;
System.out.println(c1);
它打印
int
,我觉得这有点模棱两可,因为
。class
返回类型为
class
的对象,
int
不是类(而是基元类型)

当不存在这样的类(
primitiveType.class.getName()
)时,允许对基元类型执行.class操作的动机是什么

另外,如果您看到类的
toString(
)方法
class

public String toString() {
    return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
        + getName();
}

由于基元类型不是类或接口,所以它只需打印名称(
int
int
)。那么,为什么允许创建不存在的类的
Class
对象呢?

原语不是类。这些是Java中的一些保留类型

当您说Integer时,它是java.lang包中的一个类,例如:

类整数{ ............ }

所以对于任何可以使用的类.class,不适用于原语。顺便说一句,你为什么需要这个?有什么用?

它记录在:

基本Java类型(boolean、byte、char、short、int、long、float和double)以及关键字void也表示为类对象

当您想要调用一个通过反射期望基元参数的方法时,它特别有用

想象一种方法:

class MyClass {
    void m(int i) {}
}
您可以通过以下方式访问它:

MyClass.class.getDeclaredMethod("m", int.class);

找到另一个应用程序,例如
int.class
。考虑模拟方法

class MyClass {
    int myMethod(final int arg) {}
}
要使用Mockito对其进行模拟,您可以使用:

    when(myClass.myMethod(any(int.class)).thenReturn(1);
我自己也很惊讶,这实际上是可行的,而且比简单地说更清楚

    when(myClass.myMethod(any()).thenReturn(1);

我认为这是java中的反模式之一。实际上,您可以执行
primitive.class
(例如
int.class
)。正如@assylias所说,这有一些用例。