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

📄 type.cpp

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

RTTIType RTTIType::unknownType(RTTIType::RTTI_UNKNOWN);
RTTIType RTTIType::voidType(RTTIType::RTTI_VOID);
RTTIType RTTIType::charType(RTTIType::RTTI_CHAR);
RTTIType RTTIType::ucharType(RTTIType::RTTI_UCHAR);
RTTIType RTTIType::scharType(RTTIType::RTTI_SCHAR);
RTTIType RTTIType::shortType(RTTIType::RTTI_SHORT);
RTTIType RTTIType::ushortType(RTTIType::RTTI_USHORT);
RTTIType RTTIType::intType(RTTIType::RTTI_INT);
RTTIType RTTIType::uintType(RTTIType::RTTI_UINT);
RTTIType RTTIType::longType(RTTIType::RTTI_LONG);
RTTIType RTTIType::ulongType(RTTIType::RTTI_ULONG);
RTTIType RTTIType::floatType(RTTIType::RTTI_FLOAT);
RTTIType RTTIType::doubleType(RTTIType::RTTI_DOUBLE);
RTTIType RTTIType::boolType(RTTIType::RTTI_BOOL);


RTTIType::~RTTIType() {}

void RTTIType::getTypeName(char* buf)
{
    char* p = "???";

    switch (tag) { 
      case RTTI_UNKNOWN:
	p = "<???>";
	break;
      case RTTI_VOID:
	p = "void";
	break;
      case RTTI_CHAR:
	p = "char";
	break;
      case RTTI_UCHAR:
	p = "unsigned char";
	break;
      case RTTI_SCHAR:
	p = "signed char";
	break;
      case RTTI_SHORT:
	p = "short";
	break;
      case RTTI_USHORT:
	p = "unsigned short";
	break;
      case RTTI_INT:
	p = "int";
	break;
      case RTTI_UINT:
	p = "unsigned int";
	break;
      case RTTI_LONG:
	p = "long";
	break;
      case RTTI_ULONG:
	p = "unsigned long";
	break;
      case RTTI_FLOAT:
	p = "float";
	break;
      case RTTI_DOUBLE:
	p = "double";
	break;
      case RTTI_BOOL:
	p = "bool";
	break;
    }
    strcpy(buf, p);
}


void RTTIPtrType::getTypeName(char* buf)
{
    ptrType->getTypeName(buf);
    buf += strlen(buf);
    *buf++ = '*';
    *buf = '\0';
}

void RTTIArrayType::getTypeName(char* buf)
{
    elemType->getTypeName(buf);
    buf += strlen(buf);
    *buf++ = '[';
    if (nElems != 0) { 
	buf += sprintf(buf, "%d", nElems);
    }
    *buf++ = ']';
    *buf = '\0';
}


void RTTIDerivedType::getTypeName(char* buf) { 
    baseClass->getTypeName(buf);
}

void RTTIMethodType::getTypeName(char* buf)
{
    returnType->getTypeName(buf);
    buf += strlen(buf);
    *buf++  = '(';
    methodClass->getTypeName(buf);
    buf += strlen(buf);
    *buf++  = ':';
    *buf++  = ':';
    *buf++  = '*';
    *buf++  = ')';
    *buf++  = '(';
    for (int i = 0; i < nParams; i++) { 
	if (i != 0) { 
	    *buf++ = ',';
	}
	paramTypes[i]->getTypeName(buf);
        buf += strlen(buf);
    }
    *buf++ = ')';
    *buf = '\0';
}


void RTTIMethodType::getMethodDeclaration(char* buf, char const* name)
{
    returnType->getTypeName(buf);
    buf += strlen(buf);
    *buf++ = ' ';
    *buf++ = '\t';
    methodClass->getTypeName(buf); 
    buf += strlen(buf);
    buf += sprintf(buf, "::%s(", name);
    for (int i = 0; i < nParams; i++) { 
	if (i != 0) { 
	    *buf++ = ',';
	}
	paramTypes[i]->getTypeName(buf);
	buf += strlen(buf);
    }
    *buf++ = ')';
    *buf++ = ';';
    *buf = '\0';
}
    


⌨️ 快捷键说明

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