反射(二)

通过上一节的例子,在反射里加入数据成员,属性等,实现更加复杂的对象。

1.实现

  1 #define DATAPROP(n) {&self::n,#n,0}
  2 #define ATTRPROP(n) {&self::get##n,&self::set##n,#n,0}
  3 #define FUNCPROP(n) {&self::n,#n,0}
  4     class ObjectClass : public Object
  5     {
  6         DECL_RTTI(ObjectClass, Object);
  7         DECL_TPLT(ObjectClass);
  8     private:
  9         static  const ClassProperty& GetClassPropertys() {
 10             const static ClassProperty::BaseProperty bp[] = { &base::GetPropertys,vNull };
 11             const static DataProperty dp[] =
 12             {
 13                 DATAPROP(intValue),
 14                 DATAPROP(blValue),
 15                 DATAPROP(sintValue),
 16                 DATAPROP(floatValue),
 17                 DataProperty()
 18             };
 19             const static AttrProperty ap[] = {
 20                 ATTRPROP(Int),
 21                 AttrProperty() };
 22             const static FuncProperty fp[] = { FuncProperty() };
 23             const static ClassProperty prop(bp, dp, ap, fp);
 24             return prop;
 25         }
 26     private:
 27         int  getInt()const { return intValue; }
 28         void setInt(int i) { intValue = i; }
 29     public:
 30         int intValue;
 31         bool blValue;
 32         sint sintValue;
 33         f32  floatValue;
 34     };
 35     class ClassWithProperty : public Object
 36     {
 37         DECL_RTTI(ClassWithProperty, Object);
 38         DECL_TPLT(ClassWithProperty);
 39     public:
 40         static  const ClassProperty& GetClassPropertys() {
 41             const static ClassProperty::BaseProperty bp[] = { &base::GetPropertys,vNull };
 42             const static DataProperty dp[] =
 43             {
 44                 DATAPROP(rawString),
 45                 DATAPROP(intValue),
 46                 DATAPROP(blValue),
 47                 DATAPROP(sintValue),
 48                 DATAPROP(floatValue),
 49                 DATAPROP(strValue),
 50                 DATAPROP(objClassPointer),
 51                 DATAPROP(objClassValue),
 52                 DataProperty()
 53             };
 54             const static AttrProperty ap[] = {
 55                 ATTRPROP(Int),
 56                 ATTRPROP(Bool),
 57                 ATTRPROP(Float),
 58                 ATTRPROP(String),
 59                 AttrProperty()
 60             };
 61             const static FuncProperty fp[] = {
 62                 {&self::getValString,"ValString",0},
 63                 {&self::getPtrString,"PtrString",0},
 64                 {&self::getRefString,"RefString",0},
 65                 FuncProperty()
 66             };
 67             const static ClassProperty prop(bp,dp,ap,fp);
 68             return prop;
 69         }
 70     public: void displayProperty(int depth,const ClassProperty* props) {
 71         if (props == nullptr)return;
 72             const DataProperty* dp = props->getDataProperty();
 73             while (dp->type != Type::vNone){
 74                 int n = depth;
 75                 while (n-- >= 0)LOG_P("  ");
 76                 LOG_P("%s %s\n", dp->type.getName(),dp->desc);
 77                 const Type currType = dp->type;
 78                 if (currType != Type::vNone) {
 79                     displayProperty(proparr, depth + 1, currType.getPropertys());
 80                 }
 81                 const Type* baseTypes = dp->type.getBaseTypes();
 82                 while (*baseTypes != vNull) {
 83                     displayProperty(proparr,depth + 1,baseTypes->getPropertys());
 84                     baseTypes++;
 85                 }
 86                 dp++;
 87             }
 88
 89             const AttrProperty* ap = props->getAttrProperty();
 90             while (ap->type != Type::vNone) {
 91                 int n = depth;
 92                 while (n-- >= 0)LOG_P(" ");
 93                 LOG_P("%s %s\n", ap->type.getName(), ap->desc);
 94                 const Type* baseTypes = ap->type.getBaseTypes();
 95                 ap++;
 96             }
 97
 98             const FuncProperty* fp = props->getFuncProperty();
 99             while (fp->type != Type::vNone) {
100                 int n = depth;
101                 while (n-- >= 0)LOG_P(" ");
102                 LOG_P("%s %s\n", fp->type.getName(), fp->desc);
103                 const Type* baseTypes = fp->type.getBaseTypes();
104                 fp++;
105             }
106         }
107     public:
108         int  getInt()const { return intValue; }
109         void setInt(int i) { intValue = i; }
110         bool getBool()const { return blValue; }
111         void setBool(bool b) { blValue = b; }
112         sint getLong()const { return sintValue; }
113         void setLong(sint l) { sintValue = l; }
114         f32  getFloat()const { return floatValue; }
115         void setFloat(f32 f) { floatValue = f; }
116         void setString(AString s) { strValue = s; }
117         AString getString()const { return strValue; }
118     public:
119         const AString& getRefString(const AString& i) {
120             LOG_I("RefString:%s", i.getRawString());
121             static AString as = AtomString("atomString");
122             return as;
123         }
124         const AString  getValString(const AString  i) {
125             LOG_I("ValString:%s", i.getRawString());
126             return AtomString("atomString"); }
127         const AString* getPtrString(const AString* i) {
128             LOG_I("PtrString:%s", i->getRawString());
129             static AString as = AtomString("atomString"); return &as; }
130     private:
131         char* rawString;
132         AString strValue;
133         int intValue;
134         bool blValue;
135         sint sintValue;
136         f32  floatValue;
137         ObjectClass* objClassPointer;
138         ObjectClass  objClassValue;
139     };

2.使用

 1         ClassWithProperty ct;
 2         ct.DataMember["blValue"] = "true";
 3         ct.DataMember["objClassValue"]["intValue"] = "12";
 4         Object& subObj = ct.DataMember["objClassValue"];
 5         subObj.DataMember["intValue"] = 13.5f;
 6         s32 rf = ct.DataMember["objClassValue"]["intValue"];
 7         AString desc = ct.DataMember["objClassValue"]["intValue"];
 8         f32 rfu8 = ct.DataMember["objClassValue"]["intValue"];
 9         f64 rfud = ct.DataMember["objClassValue"]["intValue"];
10
11         FuncProperty fp = ct.getProperty().getFuncProperty("ValString");
12         AString s = fp.invoke<AString, AString>(&ct,"value");
13         LOG_I("ValString ret:%s", s.getRawString());
14
15         fp = ct.getProperty().getFuncProperty("RefString");
16         AString& rs = fp.invoke<AString&>(&ct, &AString("reff"));
17         LOG_I("RefString ret:%s", rs.getRawString());
18
19         fp = ct.getProperty().getFuncProperty("PtrString");
20         AString* ps = fp.invoke<AString*, AString*>(&ct, &AString("pointer"));
21         LOG_I("PtrString ret:%s", ps->getRawString());
时间: 2024-10-14 01:52:32

反射(二)的相关文章

入门反射(二)

原文:入门反射(二) 这篇来看一下反射的使用吧!举个例子! 举例子,肯定需要一个类啦,先建一个学生例子类: public class Student { public int Status; public int Id { get; set; } public string Name { get; set; } public string Sex { get; set; } public void Show() { Console.WriteLine("姓名:{0}", Name);

C#反射(二)

长时间没有回顾反射知识了,今天就讲解一下反射的一般第二个用法. 二.对方法,属性等的反射 首先需要写一个测试类,生成.exe或.dll文件. class Test {   public Test()//普通构造方法 {   } public string writeString(string s)//有参方法 {   return "welcome:" + s;  } public static string staticString(string s)//静态方法 {   retur

元数据与反射(二)

1.反射程序集 获取Assmbly对象有以下方法: (1)Assmbly.Load("程序集文件名称") Assembly assembly = Assembly.Load("类库Demo"); (2)Assmbly.LoadFrom("程序集文件名") Assembly assembly = Assembly.LoadFrom("类库Demo.dll"); 上述两个方法的区别就在于Load只需要提供文件名不加后缀的信息即可.

C#反射(二) 【转】

如果没有看<C#反射(一)>.建议先看<C#反射(一)>再看这一篇.上一篇文章发表,有人评论我所写的东西比较基础.其实我也知道我也只不过是在写最基础的语法而已,之所以写它是因为自己学编程学了一两年之后才接触到反射,相信会有很多人跟我有过同样的经历.概其原因,书店里几乎90%的书籍都不谈反射.还有,曾经在百度.goole搜索过反射,但也很难找到自己喜欢的答案.希望我所写的东西能为那些初学编程的新手有所帮助. 我不想在这里过多的描述反射的概念.我还是用我自己觉得最简单.最直接的语言来描

跟我学Java反射——二步曲

上一篇文章我们已经将反射的基本知识和class类以及类的加载器进行了介绍,在上一篇我们还学习了四种得到Class类对象的方式,但是有了class对象我们能做些什么呢,学习完这篇文章,就可以得到答案了. 获取类的完整结构 这篇文章我们主要通过demo来学习,我先将demo需要用到的代码进行简单介绍. 一个接口MyInterface代码: package com.tgb.reflect.common; import java.io.Serializable; public interface MyI

Java反射(二):检测类的修饰符和类型

一个类可被若干个能影响其运行时行为的修饰符声明: 访问修饰符:public,protected,private 需要重载的修饰符:abstract 限制为只有一个实例的:static 阻止值修改:final 强制严格浮点行为:strictfp 注解 不是所有的修饰符能用在所有的类上.比如final不能修饰接口,枚举不能是abstract.java.lang.reflect.Modifier包含了所有可能修饰符的声明,它也包含用来编码由Class.getModifiers()返回的修饰符集合的方法

java反射快速入门(一)

本文会从以下几个方面讲起 ① 反射的简单解释 ② java反射的API接口 及 demo ③ 反射的优缺点.应用场景 一.什么是反射? java反射:在程序运行中动态获取类的信息,及动态调用对象的方法,这就是java反射 二.java反射的API接口 常用API接口规律 getXX() : 获取类本身 及父类的public属性.方法等 getDeclaredXX() :  获取类本身的所有私有.保护属性.方法等 getDeclaredXX(String name) : 获取类本身的指定name的

C#反射的实现

一,什么是反射? 1,System.Reflection 命名空间中的类与 System.Type 使你能够获取有关加载的程序集和其中定义的类型的信息,如类.接口和值类型. 可以使用反射在运行时创建.调用和访问类型实例. 2,System.Type 类对于反射起着核心的作用. 当反射请求加载的类型时,公共语言运行时将为它创建一个 Type. 您可以使用 Type 对象的方法.字段.属性和嵌套类来查找有关该类型的所有信息. 3,动态的创建类型的实例,将类型邦定到现有对象,或从现有对象中获取类型 (

1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态. 3. 用户线程和守护线程有什么区别? 当我们在Java

面向对象之: 反射和双下方法

目录 一, 反射 二, 函数VS方法 三, 双下方法 一, 反射 反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性 python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数,下列方法适用于类和对象(一切对象,类本身也是对象) # 对实例化对象的示例 class Foo: f = '类的静态变量' def __init__(self, name, age): self.name = name sel