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++中获得完整的类型名称等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)