Как все мы знаем, когда мы вызываем конструктор класса, подобного этому:
instance := TSomeClass.Create;
Компилятор Delphi фактически выполняет следующие действия:
- вызов статического метода NewInstance.
выделить память и инициализировать
макет памяти.
- вызов метода конструктора для
выполнить инициализацию класса
- Вызов метода AfterConstruction
Это просто и легко понять. но я не совсем уверен, как компилятор обрабатывает исключения на втором и третьем шаге.
Кажется, в D2010 нет явного способа создания экземпляра с использованием метода конструктора RTTI. поэтому я написал простую функцию в 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% правильно. поэтому, пожалуйста, покажи мне путь. Спасибо!