
二楼说的只能在类模板中才能用。
我尝试过这种方法,先声明一个基类,其他类在其基础上进行派生:
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)
// 用于指定使用本对象的管理者类函数的实例对象指针。
/
}
具体指向哪个无关紧要,这个交给编译器就好了。类的成员变量是连续的地址,不同的对象有不同的地址。但是该类的成员函数只占用一个存储区域,所有该类的对象调用成员函数时都会指向同一内存区域。
不管是类也好,函数也好,还是其他数据类型,编译完了都是内存地址了,没什么指针,变量的区别了。
这个RUNTIME_CLASS是一个宏,具体如下:
#define RUNTIME_CLASS(class_name) \
(&class_name::class##class_name)
其中##是字符连接 *** 作,比如
you##me 相当于youme。
RUNTIME_CLASS返回的是该类的一个类对象的数据成员地址
如上:RUNTIME_CLASS(CDocument)就会返回:的成员对象的classCDocument数据成员
但具体它指什么,比较复杂,要知道详情,可以参照侯捷的《深入浅出MFC》。
希望对楼主有所帮助!
用途在Art中Hook JNI相关函数。存在jobject jclass 参数时需要得到具体的类名。
在Art虚拟机中:
jobject在内存中表现为:art::mirror::Object,可从GetObjectClass方法中分析得到(art/runtime/jni_internalcc)
jclass在内存中表现为:art::mirror::Class,可从GetSuperclass方法中分析得到(art/runtime/jni_internalcc)
获取类名重点在art::mirror::Class类中,通过分析Class 类发现在art/runtime/mirror/class-inlh头文件中存在一个获取类名的方法
上述方法存在两个问题:
综上所述,GetName不适合获取类名
在dalvik虚拟机中存在一个方法dvmDecodeIndirectRef,可以将jobject、jclass转为对应的内存结构指针。
经过查找发现在/art/runtime/threadcc中存在一个方法DecodeJObject可以将jobject、jclass转换为对应的内存结构指针
DecodeJObject是Thread类的一个方法,通过dlsym拿到方法地址后,其表现形式如下:
第一个参数表示this即当前对象。可以通过如下方法获取Thread对象的实例
同时发现/art/runtime/mirror/classcc中存在GetDescriptor方法可以获取art::mirror::Class的类名
GetDescriptor是Class类的一个方法,通过dlsym拿到方法地址后,其表现形式如下:
第一个参数表示this即当前对象。可以通过DecodeJObject获取Class对象的实例,
在最终可以整理得到获取jclass类名的方法:
获取jobject方法就简单一点其内存结构可以精简如下:
其中klass就是Class对象的指针,最终整理后的方法如下:
上述方法太过于麻烦,后面给出一个简单的方法,可以模拟dalvik解析dex拿到类名。不早了,睡了
ConfMgrclass是获取ConfMgr的class对象,类型类指的是代表一个类型的类,因为一切皆是对象,几种获取class对象的方法:
1,所有的引用数据类型(类-类型)的类名、基本数据类型都可以通过class方式获取其 Class对象。
对于基本数据类型的封装类还可以通过TYPE 的方式获取其 Class 对象,但要注意。TYPE 实际上获取的封装类对应的基本类型的 Class 对象的引用。
那么你可以判断出intclass==IntegerTYPE 返回 true,intclass==Integerclass 返回 false!通过这种方式不会初始化静态域,使用class、TYPE 的方式获取 Class对象叫做类的字面常量;
2,Class 的 forName(String name)传入一个类的完整类路径也可以获得 Class 对象。
由于使用的是字符串,必须强制转换才可以获取泛型的Class<T>的 Class对象,并且必须获取这个方法可能抛出的ClassNotFoundException异常。这种方法可以初始化静态域。
3,还可通过类的对象实例下的getClass()方法来获取Class对象,即 实例名getClass()
扩展资料
在一个面向对象的系统中,类(class)是数据和 *** 作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。
每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。
当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类。
通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中。
通过运行与 *** 作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用 。
参考资料:
NOKIA的非S60机子真的非常不人性化 S60与S40的区别很大,有点难形容 S60真的可以做到很多很多,而S40有局限性 即使5310和6120价钱差不多,但是我还是选择了6120 6120不仅强大,而且不像5310那样靠时尚音乐这个噱头而赢得掌声的 6120掉漆的话多多少少会有点,不过我的只是在导航键那里而已,我觉得完全可以自己涂点东西解决。通话音量是可以调节的,我并不觉得小 还有,5310的电池很小,不耐用
以上就是关于如何在C++中获得完整的类型名称全部的内容,包括:如何在C++中获得完整的类型名称、一个指针class类型,它是指向class类的成员变量还是函数还是数据、RUNTIME_CLASS返回的指针是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)