I'm trying to determine the type of a field on an object. I don't know the type of the object when it is passed to me but I need to find fields which are long
s. It is easy enough to distinguish the boxed Long
s but the primitive long
seems more difficult.
I can make sure that the objects passed to me only have Longs
, not the primitives, but I'd rather not. So what I have is:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class)) {
// found one -- I don't get here for primitive longs
}
}
A hacky way, which seems to work, is this:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class) || clazz.getName().equals("long")) {
// found one
}
}
I'd really like a cleaner way to do this if there is one. If there is no better way then I think that requiring the objects I receive to only use Long
(not long
) would be a better API.
Any ideas?
You can just use
If you are using reflection, why do you care, why do this check at all. The get/set methods always use objects so you don't need to know if the field is a primitive type (unless you try to set a primitive type to the null value.)
In fact, for the method get() you don't need to know which type it is. You can do
If you are not sure if it is a Number type you can do
You're using the wrong constant to check for Long primitives - use
Long.TYPE
, each other primitive type can be found with a similarly named constant on the wrapper. eg:Byte.TYPE
,Character.TYPE
, etc.To detect fields with
long
type uselong.class
orLong.TYPE
.To detect fields with
Long
type useLong.class
.Example:
Notice:
Long.TYPE
is static Constant member and is equivalent tolong.class
.snippet code form
Long
ClassAlso check for answer for Difference between Integer.class and Integer.TYPE question