如何使用Javassist获取基本类型类?

如何使用Javassist获取基本类型类?,java,reflection,javassist,Java,Reflection,Javassist,在我的程序中,我处理类和基本类型。 如果程序找到一个类,它只需执行以下调用之一: Class.forName(classname) cc.toClass()其中cc是CtClass 但是,如果它找到一个基元类型,情况会变得更糟: Class.forName不可用,不能与基元类型一起使用 cc.toClass()返回null 可以从基元类型包装类调用TYPE字段,但是如何使用反射呢 这是我的密码: CtClass cc;//Obtained from caller code Class&l

在我的程序中,我处理类和基本类型。 如果程序找到一个类,它只需执行以下调用之一:

  • Class.forName(classname)
  • cc.toClass()
    其中
    cc
    CtClass
但是,如果它找到一个基元类型,情况会变得更糟:

  • Class.forName
    不可用,不能与基元类型一起使用
  • cc.toClass()
    返回
    null
可以从基元类型包装类调用
TYPE
字段,但是如何使用反射呢

这是我的密码:

CtClass cc;//Obtained from caller code
Class<?> classParam;
if (cc.isprimitive()) {
    classParam= ?? // How can I get TYPE field value with reflection ?
} else {
    String nomClasseParam = cc.getName();

    if (nomClasseParam.startsWith("java")) {
        classeParam = Class.forName(nomClasseParam);
    } else {
        classeParam = cc.toClass();
    }
 }
ctcc类//从调用方代码中获取
类参数;
if(cc.isprimitive()){
classParam=??//如何通过反射获取类型字段值?
}否则{
字符串nomClasseParam=cc.getName();
if(nomClasseParam.startsWith(“java”)){
classeParam=Class.forName(nomClasseParam);
}否则{
classeParam=cc.toClass();
}
}
Javassist 3.12.0.GA

编辑: 我已经在下面的anwsers上发布了。
无论如何,我勾选了。

您可以为原语的对象包装器执行Class.forName(例如,原语int的整数)。Java支持自动装箱,因此您可以在对象包装器和原语对应物之间进行交换

我假设您正在使用JavaAssist。
如果
cc
是一个原语,我认为它将是
CtPrimitiveType
(需要确认)的一种类型,在这种情况下,您可以强制转换并调用以获取包装类。

在我看来,您可以将
cc
强制转换为其子类

如果您想要一个包装器,那么可以使用该方法来获取相应包装器的类名。您可以像往常一样使用将该名称转换为
对象。然而,我不认为你需要一个包装,所以这没有帮助

相反,我认为您需要,然后是一个费劲的手工编码的switch语句:

switch(descriptor) {
    case 'I': classParam = int.class; break;
    // etc
}

类似的东西应该在Javassist中出现。但据我所知,情况并非如此。

根据Tom和momo的回答,我提出了以下解决方案:

CtClass cc; //Obtained from caller code
Class<?> classParam;

if (cc.isprimitive()) {
    classParam = Class.forName(((CtPrimitiveType)cc).getWrapperName());
    classParam = (Class<?>)classParam.getDeclaredField("TYPE").get( classParam );
} else {
    String nomClasseParam = cc.getName();

    if (nomClasseParam.startsWith("java")) {
        classeParam = Class.forName(nomClasseParam);
    } else {
        classeParam = cc.toClass();
    }
 }
ctcc类//从调用方代码中获取
类参数;
if(cc.isprimitive()){
classParam=Class.forName(((CtPrimitiveType)cc.getWrapperName());
classParam=(类)classParam.getDeclaredField(“类型”).get(类参数);
}否则{
字符串nomClasseParam=cc.getName();
if(nomClasseParam.startsWith(“java”)){
classeParam=Class.forName(nomClasseParam);
}否则{
classeParam=cc.toClass();
}
}
我调用
CtPrimitiveType#getWrapperName
方法,然后使用TYPE字段获取primitivetype类。我还避免编写switch语句


谢谢你们的帮助。

另一个问题肯定会有帮助:@Andreas\u没有太多,因为我想用java反射执行调用。但是我们可以使用
boolean.class
int.class
等等作为
class
对象,当我们使用问题中的示例代码反映方法和构造函数时,如何实现它?这个问题实际上不是关于反射,而是关于javassist。问题是我们如何从一个CtClass实例到一个Class实例。这在反射的世界里是不正确的(你说得对,Java确实支持自动装箱,但我操作的类是由Javassist动态生成的。生成的类有一个带有
int
参数的方法。如果我在
class.forName
@dawce Argh中给他
Java.lang.Integer
参数,类加载器就找不到这个方法,我不知道:(应该更多地使用反射。Stephan看起来Tom的答案应该有效。cc的类型是
CtPrimitiveType
。我将检查
getWrapperName
。最后,我使用
getWrapperName
,我避免了编写switch语句。考虑到只有八种基本类型,编写起来就不会那么费力了。