⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 class.cpp

📁 java 反射机制详解示例,实现类属性及方法修改
💻 CPP
字号:
#include <string.h>
#include <stdlib.h>
#include "reflect.h"

RTTIFieldDescriptor* RTTIClassDescriptor::findField(char const* name) 
{ 
    int l = 0, r = nFields;
    while (l < r) { 
	int i = (l + r) >> 1;
	if (strcmp(name, fields[i]->name) > 0) { 
	    l = i+1;
	} else { 
	    r = i;
	}
    }
    if (r < nFields && strcmp(fields[r]->name, name) == 0) { 
	return fields[r];
    }
    return NULL;
}

static int cmpFields(const void* p, const void* q) { 
    return strcmp((*(RTTIFieldDescriptor**)p)->getName(), (*(RTTIFieldDescriptor**)q)->getName());
} 

static int cmpMethods(const void* p, const void* q) { 
    return strcmp((*(RTTIMethodDescriptor**)p)->getName(), (*(RTTIMethodDescriptor**)q)->getName());
} 


RTTIClassDescriptor::RTTIClassDescriptor(char const* name, int size, 
					 RTTIDescribeFieldsFunc  describeFieldsFunc,
					 RTTIDescribeMethodsFunc describeMethodsFunc, 
					 RTTICreateInstanceFunc  createInstanceFunc,
					 int flags) 
: RTTIType(RTTI_STRUCT) 
{
    this->name = name;
    this->size = size;
    this->defaultConstructor = NULL;
    this->createInstanceFunc = createInstanceFunc;
    this->flags = flags;
    fieldList = (*describeFieldsFunc)();
    methodList = (*describeMethodsFunc)();
    buildClassDescriptor();
    RTTIRepository* repo = RTTIRepository::getInstance();
    repo->addClass(this);
}

void* RTTIClassDescriptor::newInstance()
{
    if (createInstanceFunc) { 
	return (*createInstanceFunc)();
    } else {
	void* p = new char[size];	
	(*defaultConstructor)(p);
	return p;
    }
}

RTTIClassDescriptor::RTTIClassDescriptor(char const* name, int size, int flags) 
: RTTIType(RTTI_STRUCT) 
{
    this->name = name;
    this->size = size;
    this->defaultConstructor = NULL;
    this->createInstanceFunc = NULL;
    this->flags = flags;
    this->fieldList = NULL;
    this->methodList = NULL;
    initialized = false;
}

void RTTIClassDescriptor::buildClassDescriptor()
{
    int i, n, nb;
    RTTIFieldDescriptor *fd;
    RTTIMethodDescriptor* md;

    for (fd = fieldList, n = 0, nb = 0; fd != NULL; fd = fd->next) { 
	n += 1;
	fd->declaringClass = this;
	if (fd->type != NULL && fd->type->tag == RTTI_DERIVED) { 
	    nb += 1;
	}
    }
    nBaseClasses = nb;
    baseClasses = new RTTIClassDescriptor*[nb];    
    fields = new RTTIFieldDescriptor*[n];
    nFields = n;
    for (fd = fieldList, n = 0, nb = 0; fd != NULL; fd = fd->next) { 
	fields[n++] = fd;
	if (fd->type != NULL && fd->type->tag == RTTI_DERIVED) { 
	    baseClasses[nb++] = ((RTTIDerivedType*)fd->type)->getBaseClass();
	}
    }
    qsort(fields, n, sizeof(RTTIFieldDescriptor*), cmpFields);
    for (i = 0; i < n; i++) { 
	fields[i]->index = i;
    }

    for (n = 0, md = methodList; md != NULL; md = md->next) { 
	n += 1;
    }
    nMethods = n;
    methods = new RTTIMethodDescriptor*[n];
    for (n = 0, md = methodList; md != NULL; md = md->next) { 
	methods[n++] = md;
    }
    qsort(methods, n, sizeof(RTTIMethodDescriptor*), cmpMethods);
    for (i = 0; i < n; i++) { 
	methods[i]->index = i;
    }
    initialized = true;
}


void RTTIClassDescriptor::getTypeName(char* buf)
{
    strcpy(buf, name);
}

RTTIMethodDescriptor* RTTIClassDescriptor::findMethod(char const* name) 
{ 
    int l = 0, r = nMethods;
    while (l < r) { 
	int i = (l + r) >> 1;
	if (strcmp(name, methods[i]->name) > 0) { 
	    l = i+1;
	} else { 
	    r = i;
	}
    }
    if (r < nMethods && strcmp(methods[r]->name, name) == 0) { 
	return methods[r];
    }
    return NULL;
}



RTTIClassDescriptor::~RTTIClassDescriptor()
{
    delete[] baseClasses;
    delete[] methods;
    delete[] fields;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -