Как мы все знаем, когда мы вызываем конструктор такого класса:
instance := TSomeClass.Create;
Компилятор Delphi действительно выполняет следующие действия:
- Вызов статического метода NewInstance для выделения памяти и инициализации расположение памяти.
- Вызов метода конструктора для выполнить инициализацию класса
- Вызов метода AfterConstruction
Это просто и легко понять. но я не очень уверен, как компилятор обрабатывает исключения во втором и третьем шагах.
Кажется, нет явного способа создания экземпляра с использованием метода конструктора RTTI в D2010. поэтому я написал простую функцию в Spring Framework для Delphi для воспроизведения процесса создания.
class function TActivator.CreateInstance(instanceType: TRttiInstanceType;
constructorMethod: TRttiMethod; const arguments: array of TValue): TObject;
var
classType: TClass;
begin
TArgument.CheckNotNull(instanceType, 'instanceType');
TArgument.CheckNotNull(constructorMethod, 'constructorMethod');
classType := instanceType.MetaclassType;
Result := classType.NewInstance;
try
constructorMethod.Invoke(Result, arguments);
except
on Exception do
begin
if Result is TInterfacedObject then
begin
Dec(TInterfacedObjectHack(Result).FRefCount);
end;
Result.Free;
raise;
end;
end;
try
Result.AfterConstruction;
except
on Exception do
begin
Result.Free;
raise;
end;
end;
end;
Я чувствую, что это может быть не на 100% правильно. поэтому, пожалуйста, покажи мне путь. Спасибо!