并非所有Class
对象都代表类/引用类型;还有Class
代表原始类型的对象。这很有用,因为在对字段和方法使用反射时,您通常需要指定它们的类型,并且它可以是原始类型。SoClass
用于表示所有此类预泛型类型。
However, many of the methods of the Class
class do not make sense for primitive types. For example, it is impossible for an object to be instanceof int
. Therefore, the analogous .isInstance()
method will always return false
. Since the parameter of that method is type Object
, it is simply impossible from a language point of view for what you pass in there to be of a primitive type.
Sure, in Java 5+ when you pass a primitive to a parameter of type Object
, it undergoes autoboxing, but the fact that it underwent autoboxing means that what was passed is actually a reference to an object. Reference types and primitive types are distinct. A parameter is either a reference type or primitive type. Thus you cannot write a method that can take a "reference or primitive".
What you may be asking, in your example, is to detect that the object was autoboxed from a primitive, and compare it to a primitive type. However, it is impossible to detect whether the caller autoboxed it, since autoboxing is a completely caller-side operation that happens before the call.
However, assuming it was autoboxed, you know what type it should have gone to. If you are expecting an int
, and it is autoboxed and passed to your method, it should be an instance of Integer
. Thus, what you could do is, when clazz
represents a primitive type, instead perform the check on its wrapper class. Thus, when it sees that clazz
is int.class
, substitute it with Integer.class
, and then perform the check. Note that this way still doesn't tell whether what was passed as the o
parameter was autoboxed.