java是不支持在运行中进行强制转化的! 如果事先知道类型,可以通过强制转化实现! 如果不知道! 可以采用这种方式!
String className = objgetClass()getName(); 得到类名
然后:
A a = (A)ClassforName(className)newInstance();
//上面这句话的意思是,forName(className):静态加载className这个类;
// newInstance(),实例化一个对象
// A 代表你知道的这人类或者这个类的父类, 把强制转化成你所要的对象。
这和你
A a = new A();
是一样的效果!
二楼说的只能在类模板中才能用。
我尝试过这种方法,先声明一个基类,其他类在其基础上进行派生:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)
// 用于指定使用本对象的管理者类函数的实例对象指针。
/
}
根据attr(attribute)获取属性名,必须知道上一级的div的class名或者id名,
或者本身知道div的class或者id要获取其他属性,都是这么做的。$("#d1")attr("xxx");xxx是你想获取的某个属性的值。
完整如下:
<div id="div1"><div class="c1" id="d1"></div></div>
$("#div1")find("div")attr("id")
$("#div1")find("div")attr("class")
ClassforName()是根据类名称加载类 比如有一个类名为comabcAAA 此处ClassforName(‘comabcAAA ’)newInstance()就会创建一个AAA对象而class一般用来获取类的通用属性 比如AAAclassgetDeclareMethod()是获取AAA类的所有声明的方法 主要用于反射机制
用途在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拿到类名。不早了,睡了
以上就是关于java 如何通过对象获取对象类全名全部的内容,包括:java 如何通过对象获取对象类全名、如何在C++中获得完整的类型名称、如何用Jquery获取某一个Div的Class或者ID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)