When we say
Class c = Integer.class; System.out.println(c);
it prints
class java.lang.Integer
which makes sense because java.lang.Integer
is a class. So we can have a corresponding Class
object.
But when I do
Class c1 = int.class; System.out.println(c1);
it prints int
which I felt is kind of ambiguous as .class
returns an object of type Class
and int
is not a class (but a primitive type).
What is the motive behind allowing .class operation on primitive types when there is no such class (primitiveType.class.getName()
) present?
Also if you see toString(
) method of class Class
public String toString() { return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); }
As primitive types are not classes or interfaces it simply print the name (int
for int
). So why allow creating Class
objects of a class which is not present?
Advertisement
Answer
It is documented in the javadoc:
The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
It is particularly useful when you want to call a method that expects primitive arguments via reflection.
Imagine a method:
class MyClass { void m(int i) {} }
You can access it with:
MyClass.class.getDeclaredMethod("m", int.class);