如何在C++中获得完整的类型名称

如何在C++中获得完整的类型名称,第1张

如何在C++中获得完整的类型名称
问题很简单。首先解释一下类型名。类型名是用来修饰变量或者函数返回值的。如inta=0;其中a是变量名,int是类型名,说明a这个变量的类型是int。结构名,先看下下面的一个结构定义structstudent{charname[100];};其中student就是结构名,它可以作为类型名,来修饰一个变量,如studentstu;说明stu变量的类型名是student。联合名unionperson{intage;};其中person就是联合名,它可以作为类型名,来修饰一个变量,如personper;说明per变量的类型名是person。枚举名enumReCode{ret_OK=0,};其中ReCode就是枚举名,它可以作为类型名,来修饰一个变量,如ReCodecode;说明code变量的类型名是ReCode。建议你看看书,你的基础太薄弱了,欢迎采纳!

Class1s xx = new Class1s();
var inters = xxGetType()GetInterfaces();//获取所有继承的泛型类型
if (intersLength > 0)
{
var ts = inters[0]GetGenericArguments();//获取第一个泛型的形参类型数组
if (tsLength > 0)
{
var res = ts[0];//获取到Class1
//todo:后续代码
}
}
已知类型Class1,获取它的属性集合,你上面的代码已经有了。
有点要注意,在获取第一个泛型的形参类型那里,不用的类型继承的泛型接口也不同,例如,可能是IList、IList、Dictionary的,所以不一定是第一个泛型就可以获取出T。这里应该还是有根据实际情况做相应处理的过程。
另外,如果已知是List的话,有一个很简单的方法:
xxGetType()GetMethod("Find")ReturnType。就可以返回Class1的Type了,这种就很有针对性,专门针对List的T Find()函数设计。获得Find函数的返回类型即可。
希望能给你启示。

public static Object getType(Class c) throws Exception{
    Field f = cgetDeclaredField("TYPE");
    Object obj = fget(c);
    return obj;
}
public static void main(String[] args) throws Exception {
    Systemoutprintln(getType(Integerclass));
}

TgetClass()或者Tclass都是非法的,因为T是泛型变量。
由于一个类的类型是什么是在编译期处理的,故不能在运行时直接在Base里得到T的实际类型。
有一种变通的实现方式:
import javalangreflectArray;
import javalangreflectParameterizedType;
import javalangreflectType;
public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
Systemoutprintln(carray);
}
Object array ;
public Generic() {
array = ArraynewInstance(getGenericType(0), 100);
}
}
class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass()getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Objectclass;
}
Type[] params = ((ParameterizedType) genType)getActualTypeArguments();
if (index >= paramslength || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Objectclass;
}
return (Class) params[index];
}
}
其中Base<T>是泛型类,在父类中声明getGenericType,子类继承具体的Base<String>,那么在子类中就可以通过getGenericType(0)获取到String的class

使用getClass方法可以获取一个对象的类型类,然后在调用该类的方法可以获取该类的相关信息,比如父类的名字,该类的名字等等:
package test;
import javalangreflectField;
import javalangreflectMethod;
public class Demo2 {
String username = "sss";
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException {
Demo2 t = new Demo2();
if (Demo2class == tgetClass()) {
Systemoutprintln("equal");
}
// 获取类名
Systemoutprintln(tgetClass()getName());
// 获取父类名
Systemoutprintln(tgetClass()getSuperclass());
//获取类中某个属性
Field f = tgetClass()getField("username");
//获取类中某个方法
Method m = tgetClass()getDeclaredMethod("main", String[]class);
}
}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13402689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存