检查原始字段的类型
我正在尝试确定对象上字段的类型。当对象传递给我时,我不知道该对象的类型,但我需要查找 long
的字段。区分装箱的 Long
很容易,但原始的 long
似乎更困难。
我可以确保传递给我的对象只有Long
,而不是基元,但我宁愿不这样做。所以我所拥有的是:
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
}
}
一种似乎有效的黑客方法是:
for (Field f : o.getClass().getDeclaredFields()) {
Class<?> clazz = f.getType();
if (clazz.equals(Long.class) || clazz.getName().equals("long")) {
// found one
}
}
如果有的话,我真的很想要一种更干净的方法来做到这一点。如果没有更好的方法,那么我认为要求我收到的对象仅使用 Long
(而不是 long
)将是一个更好的 API。
有什么想法吗?
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您使用了错误的常量来检查 Long 原语 - 使用
Long.TYPE
,每个其他原语类型都可以在包装器上使用类似命名的常量找到。例如:Byte.TYPE
、Character.TYPE
等。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.您可以只使用
如果您正在使用反射,那么您为什么要关心,为什么要进行此检查。 get/set 方法总是使用对象,因此您不需要知道该字段是否是原始类型(除非您尝试将原始类型设置为 null 值)。
事实上,对于 get() 方法,您不需要 知道该字段是否为原始类型(除非您尝试将原始类型设置为 null 值)。不需要知道它是什么类型。 做
如果您不确定它是否是 Number 类型,您可以这样
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
要检测
long
类型的字段,请使用long.class
或Long.TYPE
。要检测
Long
类型的字段,请使用Long.class
。示例:
注意:
Long.TYPE
是静态常量成员,等同于long.class
。片段代码形式
Long
类另请检查 答案 的 Integer.class 和 Integer.TYPE 之间的区别问题
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