Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Aquahawk

Рейтинг: 5.00. Голосов: 3.

Создание инстанса объекта без статической инициализации класса.

Запись от Aquahawk размещена 10.09.2012 в 16:56

На работе столкнулись с особенностью работы cinit и по мотивам был сооружён следующий пример. Если выбросить исключение cinit то он не завершится, а ссылка на класс в global примет значение null. Однако во время этого самого cinit ссылка внутри доступна, и компилятор её складывает в нулевой регистр виртаульной машины. Оттуда можно достать ссылку на этот, статически не инициализированный класс. Ну а потом объекты можно создавать и всё такое.

Код AS3:
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));
		}
	}
}
Код AS3:
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

Комментарии

Старый 10.09.2012 18:27 Котяра вне форума
Котяра
 
Аватар для Котяра
А в чём магия? И практическая польза?
Старый 10.09.2012 18:28 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
Забыл в конце дописать, что не стоит спрашивать где и как это можно применить. Это просто эксперимент на понимание того как что работает.
Старый 10.09.2012 18:28 Котяра вне форума
Котяра
 
Аватар для Котяра
поздно)
Старый 10.09.2012 18:29 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
Котяра Не успел, блин, написать что не спрашивайте зачем. Магия в том что можно иметь инстанс и не иметь возможности достать его класс. Особенно если переопределить геттер конструктора.
Старый 10.09.2012 21:26 dimarik вне форума
dimarik
 
Аватар для dimarik
Цитата:
можно иметь инстанс и не иметь возможности достать его класс
Это просто прекрасно.
Старый 10.09.2012 21:41 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
dimarik
Цитата:
Это просто прекрасно.
Я знал что мой труд оценят по достоинству
Старый 10.09.2012 23:33 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Цитата:
можно иметь инстанс и не иметь возможности достать его класс
Ну так того же можно добиться и приватным классом... ссылку ж на конструктор никто не отберет?
Старый 10.09.2012 23:52 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
Цитата:
ссылку ж на конструктор никто не отберет?
Код AS3:
public function get constructor():Class {
return AnythingYouWant; // или ошибку можно кинуть, или вообще нулл вернуть.
}
Старый 10.09.2012 23:53 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
Да и через getDefenitionByName должно всё что угодно выдернуться, или нет? никогда не пробовал
Старый 11.09.2012 00:13 i.o. вне форума
i.o.
 
Аватар для i.o.
приватный класс не выдернется
Старый 11.09.2012 01:38 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
приватный класс не выдернется
А смысл какой в приватном классе, разве с ним можно работать ?!
Старый 11.09.2012 01:43 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
ага, в рамках области видимости создать объект можно, отдать его куд нибудь тоже можно.
Старый 11.09.2012 02:27 ChuwY вне форума
ChuwY
 
Аватар для ChuwY
Кажется, что я что-то упустил в жизни.
Что за приватные классы?
Вы об интернал в файле, но вне пакета?
Старый 11.09.2012 02:47 i.o. вне форума
i.o.
 
Аватар для i.o.
Цитата:
А смысл какой в приватном классе, разве с ним можно работать ?!
в соседнем блоге пример с использованием даже есть, говорят...

Цитата:
Вы об интернал в файле, но вне пакета?
Да. По своей природе это самый настоящий приват.
Старый 11.09.2012 03:25 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Да. По своей природе это самый настоящий приват.
Да это понятно блин, я то думал конкретно private class SuperPrivate ))
Старый 11.09.2012 13:15 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
Действительно, приватный класс на выдёргивается. Даже при использовании полного нейма из describeType. Однако выдёргивается из инстанса через obj['constructor']. Если определить геттер конструктора то никак класс не достанешь.
Старый 17.09.2012 01:34 ~~~ вне форума
~~~
 
Аватар для ~~~
Цитата:
Даже при использовании полного нейма из describeType.
Если не изменяет память, имя должно быть такое:
Код AS3:
package.blah.blah:ClassName#InternalClassName
Возможно там слэш вместо # - не помню.
 

 


Часовой пояс GMT +4, время: 16:47.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.