Создание инстанса объекта без статической инициализации класса.
Запись от Aquahawk размещена 10.09.2012 в 16:56
На работе столкнулись с особенностью работы cinit и по мотивам был сооружён следующий пример. Если выбросить исключение cinit то он не завершится, а ссылка на класс в global примет значение null. Однако во время этого самого cinit ссылка внутри доступна, и компилятор её складывает в нулевой регистр виртаульной машины. Оттуда можно достать ссылку на этот, статически не инициализированный класс. Ну а потом объекты можно создавать и всё такое.
package { import flash.display.Sprite; import flash.utils.describeType; import flash.utils.getDefinitionByName; /** * ... * @author Aquahawk */ public class Main extends Sprite { public static var LINK_TO_UNINITED_CLASS:Class; public function Main() { super(); try { new Test(); } catch (error:Error) { trace('catched'); } trace(Test); trace(getDefinitionByName('Test')); trace(describeType(Test)); trace(LINK_TO_UNINITED_CLASS); var t:Test = new LINK_TO_UNINITED_CLASS(); trace(t); trace(describeType(t)); } } }
package { /** * ... * @author Aquahawk */ public class Test { trace('cinit start'); Main.LINK_TO_UNINITED_CLASS = Test; // это скомпилится в getlocal0 и там ссылка есть throw new Error(); trace('cinit end'); public function Test() { super(); trace('iinit'); } public var testStr:String; } }
Код:
cinit start catched null null [class Test] iinit [object Test] <type name="Test" base="Object" isDynamic="false" isFinal="false" isStatic="false"> <extendsClass type="Object"/> <variable name="testStr" type="String"> <metadata name="__go_to_definition_help"> <arg key="pos" value="283"/> </metadata> </variable> <metadata name="__go_to_ctor_definition_help"> <arg key="pos" value="218"/> </metadata> <metadata name="__go_to_definition_help"> <arg key="pos" value="75"/> </metadata> </type>
Всего комментариев 17
Комментарии
![]() ![]() |
|
А в чём магия? И практическая польза?
|
![]() ![]() |
|
Забыл в конце дописать, что не стоит спрашивать где и как это можно применить. Это просто эксперимент на понимание того как что работает.
|
![]() ![]() |
|
поздно)
|
![]() ![]() |
|
Цитата:
можно иметь инстанс и не иметь возможности достать его класс
|
![]() ![]() |
|
dimarik
Цитата:
Это просто прекрасно.
![]() |
![]() ![]() |
|
Цитата:
можно иметь инстанс и не иметь возможности достать его класс
|
![]() ![]() |
|
![]() ![]() |
|
Да и через getDefenitionByName должно всё что угодно выдернуться, или нет? никогда не пробовал
|
![]() ![]() |
|
приватный класс не выдернется
|
![]() ![]() |
|
Цитата:
приватный класс не выдернется
|
![]() ![]() |
|
ага, в рамках области видимости создать объект можно, отдать его куд нибудь тоже можно.
|
![]() ![]() |
|
Кажется, что я что-то упустил в жизни.
Что за приватные классы? Вы об интернал в файле, но вне пакета? |
![]() ![]() |
|
Цитата:
Да. По своей природе это самый настоящий приват.
|
![]() ![]() |
|
Последние записи от Aquahawk
- Мини головоломка про троичность двоичного. (09.10.2012)
- Создание инстанса объекта без статической инициализации класса. (10.09.2012)
- Меняем константы где захотим. (21.03.2012)
- Сортируем 300 000 Number быстро, ещё быстрее. (11.06.2011)