如何解决Java反射和基元上的isInstance
| 我在这里一定会丢失一些东西,但是似乎在进行一些基本思考时遇到了一些麻烦。我认为,由于像拳击这样的事情,对于下面的两个印刷品中的每一个,我都会得到真实的。这是简单的Main类:package com.reflection;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestingReflection {
public static void main(String[] args) throws SecurityException,NoSuchMethodException,IllegalArgumentException,illegalaccessexception,InvocationTargetException
{
final Class c = Reflection.class;
Reflection p = new Reflection();
p.setIntObj(new Integer(1));
p.setIntPrim(1);
for (Field field : c.getDeclaredFields()) {
char first = Character.toupperCase(field.getName().charat(0));
String capitalized = first + field.getName().substring(1);
Method getField =
c.getDeclaredMethod(\"get\" + capitalized,new Class [] {});
Class fieldClass = getField.getReturnType();
Method setField =
c.getDeclaredMethod(\"set\" + capitalized,new Class [] { fieldClass });
Object value = getField.invoke(p,new Object [] {});
if (value != null) {
System.out.println(\"Field Class: \"
+ fieldClass.getName()
+ \" instanceOf: \"
+ fieldClass.isinstance(value)
+ \" Value Class: \"
+ value.getClass().getName());
}
}
}
}
这是我要针对的课程:
package com.reflection;
public class Reflection {
private int intPrim;
private Integer intObj;
public int getIntPrim() { return intPrim; }
public void setIntPrim(int intPrim) { this.intPrim = intPrim; }
public Integer getIntObj() { return intObj; }
public void setIntObj(Integer intObj) { this.intObj = intObj; }
}
这是我收到的输出:
Field Class: int instanceOf: false Value Class: java.lang.Integer
Field Class: java.lang.Integer instanceOf: true Value Class: java.lang.Integer
我应该使用其他方法来确定这一点吗? isAssignableFrom还为基元返回false。
解决方法
获取
int
的原始类型的最简单方法是int.class
您也可以使用Integer.TYPE
,但是我相信这样做是为了向后兼容。
Java doc Class.isIntanceof(Object)说
如果此Class对象表示原始类型,则此方法返回false。
这也许不是有用的定义,但它是它的工作方式。我还没有找到获取原始类型的包装器类的简单方法,因此我使用了预定义的HashMap(它有9个类,包括void
)。
, 看看Integer.TYPE
, 为了基于Peter的答案,Class.isInstance()无法报告基本类型的原因是因为必须对作为参数传递的任何基本进行装箱以便将其传递为Object
。这本质上使得该方法对表示原始类型的“ 8”个对象无效。
当然,在您的情况下,int的值已经随您的调用一起装箱了:
Object value = getField.invoke(p,new Object [] {});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。