mac*_*tch 40 java reflection primitive
我正在尝试确定对象上字段的类型.当它传递给我时,我不知道对象的类型,但我需要找到longs的字段.很容易区分盒装,Long但原始图像long似乎更难.
我可以确保传递给我的对象只有Longs,而不是原语,但我宁愿不.所以我拥有的是:
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
}
}
Run Code Online (Sandbox Code Playgroud)
一种似乎有用的hacky方式是:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class) || clazz.getName().equals("long")) {
// found one
}
}
Run Code Online (Sandbox Code Playgroud)
如果有的话,我真的想要一个更干净的方法.如果没有更好的方法,那么我认为要求我收到的对象只使用Long(不是long)将是一个更好的API.
有任何想法吗?
mP.*_*mP. 67
您正在使用错误的常量来检查Long基元 - 使用Long.TYPE,可以在包装器上找到具有类似命名常量的其他基本类型.如:Byte.TYPE,Character.TYPE等等.
Dro*_*roo 50
o.getClass().getField("fieldName").getType().isPrimitive();
Run Code Online (Sandbox Code Playgroud)
Pet*_*rey 16
你可以使用
boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class
Run Code Online (Sandbox Code Playgroud)
如果您正在使用反射,为什么要关心,为什么要进行此检查.get/set方法总是使用对象,因此您不需要知道该字段是否是基本类型(除非您尝试将基本类型设置为空值.)
实际上,对于方法get(),您不需要知道它是哪种类型.你可以做
// any number type is fine.
Number n = field.get(object);
long l = n.longValue();
Run Code Online (Sandbox Code Playgroud)
如果您不确定它是否为数字类型,则可以执行此操作
Object o = field.get(object); // will always be an Object or null.
if (o instanceof Number) {
Number n = (Number) o;
long l = n.longValue();
Run Code Online (Sandbox Code Playgroud)
要检测long类型为long.class或的字段Long.TYPE。
要使用Longtype 来检测字段Long.class。
例:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
// to detect both Long and long types
if (Long.class.equals(clazz) || long.class.equals(clazz)) {
// found one
}
}
Run Code Online (Sandbox Code Playgroud)
注意事项:
Long.TYPE是静态的常量成员,并且等效于long.class。
代码段形式LongClass
Run Code Online (Sandbox Code Playgroud)/** * The {@link Class} object that represents the primitive type {@code long}. */ @SuppressWarnings("unchecked") public static final Class<Long> TYPE = (Class<Long>) long[].class.getComponentType();
还要检查Integer.class和Integer.TYPE问题之间的区别的答案
| 归档时间: |
|
| 查看次数: |
59118 次 |
| 最近记录: |