如何使用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语句。考虑到只有八种基本类型,编写起来就不会那么费力了。