检查Java反射类型的类

检查Java反射类型的类,java,reflection,Java,Reflection,我一直在浏览我看到的答案,到目前为止,我找不到任何适合我的解决方案。本质上,我只是使用反射来获取一个方法,然后获取它的所有参数类型,如下所示: Type[] parameters = method.getGenericParameterTypes(); 从那里,我将遍历参数,以获得它们各自的类,以便传递正确的数据。我尝试了以下方法: Type currentType = parameters[index]; Class<?> clazz = Class.forName(curren

我一直在浏览我看到的答案,到目前为止,我找不到任何适合我的解决方案。本质上,我只是使用反射来获取一个方法,然后获取它的所有参数类型,如下所示:

Type[] parameters = method.getGenericParameterTypes();
从那里,我将遍历
参数
,以获得它们各自的类,以便传递正确的数据。我尝试了以下方法:

Type currentType = parameters[index];
Class<?> clazz = Class.forName(currentType.getClass().getName());
if (clazz.isAssignableFrom(Number.class)) {
     //do stuff that is number specific
     //EG drill down farther into specific subclass like int,
     //double, etc for more exact parsing
} else if (clazz.isAssignableFrom(String.class)) {
     //Do stuff that is specific to string
} else {
     //Nope, no love here.
}
更新:根据Sotirios Delimanolis的回答,我取得了一些进展

if (currentType instanceof Class) {
    Class<?> currentClazz = (Class<?>) currentType;
    if (currentClazz.isAssignableFrom(Number.class)) {
        // This isn't getting reached for either int or Integer
    } else if (currentClazz.isAssignableFrom(String.class)) {
        // This IS working correctly for strings
    } else {
        // Both int and Integer fall here
    }
} else {
    // Are primitives supposed to be handled here? If so int isn't
    // being sent here, but is falling in the the else from the
    // condition previous to this one.
}
if(类的currentType实例){
类currentClazz=(类)currentType;
if(currentClazz.isAssignableFrom(Number.class)){
//int或Integer都无法达到此值
}else if(currentClazz.isAssignableFrom(String.class)){
//这对于字符串是正确的
}否则{
//int和Integer都在这里
}
}否则{
//原语应该在这里处理吗?如果是,int不是
//被送到这里,但却从另一个地方掉了下来
//这个之前的条件。
}
这个

已经为您提供了参数的类型

召唤

currentType.getClass()
返回类型
类型
对象,而不是所需的对象


是一个亚型。您可以检查您拥有的
类型
引用是否是
实例,然后执行
isAssignableFrom

您可以提供一个方法签名示例吗?问题1:为什么要使用反射?我问,因为这通常是一种迹象,表明你在用错误的方法解决你真正遇到的问题。除非您执行某种盲加载,否则您通常希望尽可能长时间远离反射(这是一个很好的工具,在您别无选择时可以使用)。currentType.getClass().getName()返回什么?我想这不是你所期望的。我建议你用谷歌搜索这个方法的javadocs。另外,
int.class
Integer.class
是两个不同的东西。我支持@Mike'Pomax'Kamermans。为什么要使用反射?你想解决的最初问题是什么?我不知道该怎么做
if(currentType instanceof Number){
无法识别
int
Integer
。另外
else if(currentType instanceof String){
甚至不会编译,因为它会给我一个编译器错误。你能详细说明一下或者给我指出一些文档的方向,帮助我更好地理解吗?@BCqrstoO不,
类型
对象可能是一个
,所以
if(currentType instanceof Class)
。然后将
currentType
转换为
引用,以便您可以在
isAssignableFrom
中使用它。我想我现在有了它,或者至少差不多有了。我已经更新了这个问题,以反映我相信您试图传达给我的内容。它正确地处理了String对象,但似乎没有捕捉到primitivee> int
或boxed
Integers
在这两种情况下都是。对于所有的困扰,我感到抱歉,但是反射对我来说是非常新的。@BCqrstoO首先,您的
isAssignableFrom
是向后的。该方法应该在超级类型上调用。因此
String.class.isAssignableFrom(type)
(即使
String
不能有子类型)和
Number.class.isAssignableFrom(..)
。此外,我试图在注释中暗示这一点,类型为
int
的参数将有一个
int.class
类型对象。
int.class
Integer.class
不同,并且肯定不能分配给
Number.class
。很抱歉,我确实发现它们是反向的,但我没有我还没有更新这个问题来反映这一点。我会继续自己解决如何处理原语。谢谢你的帮助!
Type currentType = parameters[index];
currentType.getClass()