Создание инстанса объекта без статической инициализации класса.
Запись от 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)














