如何通过反射获得java类中泛型T的类型

如何通过反射获得java类中泛型T的类型,第1张

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

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));

}

二楼说的只能在类模板中才能用。

我尝试过这种方法,先声明一个基类,其他类在其基础上进行派生:

class CCtrlBase

{

public:

// Constructor/Deconstructor

CCtrlBase(CCtrlBase ptr=NULL);         // 构建函数的ptr用于填写其派生类的对象指针,从而允许反向调用和访问

virtual ~CCtrlBase();

// Attributes

// 下列变量由基类和派生类的构建函数设置,用于为每个对象的信息维护提供支持

// 由对象的构建函数自动调用基类构建函数设置或其管理对象调用本对象的SetCallBack

private:

CCtrlBase          pParent;            // 管理本对象的对象的指针,由维护或管理该对象的对象在创建此对象时设置

protected:

static bool bRunOnce    ;

static int          m_process_id;       // 进程号,将作为CEmulator的m_object_index。

static int          m_object_num;       // 维护进程所创建的所有CCtrlBase对象总数

CLASS_ID            class_id_;          // 基类和派生类的类型标识

CString             class_name_;        // 基类和派生类的类型名

int                 m_object_index;     // 对象的索引值;对于无管理对象的独立对象该值由基类构建函数维护,否则由管理对象维护

public:

// Implementations

private:

protected:

int              GetSize(voidp);      // 根据内存指针计算临时内存分配的空间大小(bytes)。

CString          GetClassName();       // 用于获取当前对象的类名字串

CUDPSocket      GetUDPSocketPtr();    // 根据ptrClass指针获得Node实例指针,注意ptrClass的ClassID class_id_必须是_CNode

public:

CLASS_ID  GetClassID();// 用于获取当前对象的类名属性值(枚举类型标识)

int       SetObjID();// 用于设置ptr对象的m_object_index,当ptr为NULL时,设置为自动累加的值,否则设为其派生类或管理类中的列表索引值

int       GetObjID();// 用于查询并ptr对象的m_object_index,当ptr为NULL时,返回其派生类或管理类中的m_object_index,否则返回该对象在派生类或管理类的列表索引值,实际上通过调用其派生类或管理类的该函数以获取该值。

CCtrlBaseGetParentPtr();// 返回其管理类对象的指针,即控制者指针

void      SetCallBack(CCtrlBase ptr, bool bReplace=true);  

/

// 调用方法:pObj->SetCallBack(this)

// 用于指定使用本对象的管理者类函数的实例对象指针。

/

}

以上就是关于如何通过反射获得java类中泛型T的类型全部的内容,包括:如何通过反射获得java类中泛型T的类型、java 如何获取基本类的class、如何在C++中获得完整的类型名称等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/web/9286771.html

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

发表评论

登录后才能评论

评论列表(0条)

保存