Отражение - гнилой способ проверки свойств программы.Вы можете только «отразить» то, что парень, проектирующий компилятор, подключил к машине отражения.Обычно это не так много (какая система рефлексии, как вы знаете, позволит вам заглянуть внутрь выражения?), И это зависит от языка.И для чего-то вроде C ++, где вы пытаетесь добавить отражение в top языка, по сути, в виде набора API, вы будете крайне ограничены, или вам придется кодировать в по-настоящему неприличном стиле, которыйфактически вы можете объявить данные отражения как стандартные структуры данных.
Вместо этого вы можете использовать механизм преобразования программ (PTS) .Такой механизм манипулирует полным представлением программы и, таким образом, может технически ответить на любой вопрос, на который можно ответить.В частности, он может в принципе ответить на все вопросы об отражении, которые вы можете себе представить, потому что он действует вместо компилятора и может видеть все, что видит компилятор.(На самом деле, он может видеть больше , чем видит компилятор; компилятор ограничен одним модулем компиляции за раз, и хороший PTS может видеть сколь угодно большой набор модулей компиляции одновременно и может таким образом отвечатьвопросы о наборе в целом).
Наш инструментарий реинжиниринга программного обеспечения DMS может анализировать полный (и многие диалекты) C ++, создает AST и точные таблицы символов.Используя это, вы можете реализовать любое статическое вычислимое отражение, а затем использовать его для получения результатов анализа или непосредственного изменения AST.
DMS не зависит от языка;он может делать это для большого количества языков.
Относительно фактического использования DMS для «отражения»: OP хотел знать, как можно реализовать методы получения и установки свойств.С PTS, подобным DMS, вы анализируете исходный код интересующего вас класса, а затем проходите AST для кода.Для каждого объявления данных внутри класса вы буквально производите метод получения этих данных, создавая AST, который представляет код метода получения;для таких инструментов, как DMS, вы можете сделать это путем составления шаблонов исходного кода C ++, которые интерпретируются для представления соответствующих фрагментов AST, с заполнителями, которые вы можете заполнить другими AST.Незначительные преобразования могут затем изменить исходный AST для включения сгенерированных методов получения / установки;это производит AST, который содержит исходный код и сгенерированные методы получения / установки.Последний шаг заключается в регенерации кода из AST, что DMS делает, используя AST-to-source prettyprinters, которые являются частью «определения домена» (синтаксический анализатор, prettyprinter, преобразователь имен), которые составляют фронт языка (например, C ++)конец.