我们如何在原始类型上使用.class?

时间:2013-09-25 11:57:59

标签: java class primitive

当我们说

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

打印

  

class java.lang.Integer

这是有道理的,因为java.lang.Integer是一个类。所以我们可以有一个相应的Class对象。

但是当我做的时候

Class c1 = int.class;
System.out.println(c1);

它打印int我感觉有点模棱两可,因为.class返回类型为Class的对象而int不是类(而是基本类型)。

当没有这样的类(primitiveType.class.getName())存在时,对原始类型允许.class操作背后的动机是什么?

此外,如果您看到toString(类<{1}}

的方法
Class

由于基本类型不是类或接口,因此只需打印名称(public String toString() { return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); } 的{​​{1}})。那么为什么要允许创建一个不存在的类的int个对象呢?

3 个答案:

答案 0 :(得分:7)

记录在the javadoc

  

原始Java类型(boolean,byte,char,short,int,long,float和double)以及关键字void也表示为Class对象。

当你想通过反射调用一个需要原始参数的方法时,它特别有用。

想象一个方法:

class MyClass {
    void m(int i) {}
}

您可以通过以下方式访问它:

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

答案 1 :(得分:0)

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

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

class Integer { ............ }

因此对于任何类都可以使用.class,不适用于基元。顺便说一句,你为什么需要这个?有什么用?

答案 2 :(得分:0)

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

class MyClass {
    int myMethod(final int arg) {}
}

要使用 Mockito 进行模拟,您可以使用:

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

我自己很惊讶这确实有效,而且比简单的更清晰

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