JavaScript에서는 eval 함수를 통해서 쉽게 reflection을 할수 있는데 ActionScript는 eval함수를 원래 제공하지 않기때문에 Reflection API가 따로 존재합니다~
(JSLint라는 JavaScript Verifier를 통해 eval이 포함된 스크립트를 돌려보면 "eval is evil"이라는 재밌는 문구가 나오는군요 ㅎㅎ)

AS3는 flash.utils 패키지를 통해 reflection 기능을 제공해주는데 그 중에서 클래스의 이름을 통해 Class 객체를 얻을수 있는 getDefinitionByName() 이라는 함수가 있습니다.

재밌게도 이놈이 아래와 같이 flash로 시작하는 class 는 잘 찾아오는데

    var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class;
    var instance:Object = new ClassReference();


이 코드를 조금 바꿔서 아래처럼 flash.xxx 형태의 패키지가 아닌경우는 ReferenceError를 발생시킵니다

    var ClassReference:Class = getDefinitionByName("mx.effects.Effect") as Class;


원인은 간단합니다. flash로 시작하는 넘들은 Flash Player가 들고 있는 표준 API이고 그 외의 mx로 시작하는 클래스나 그외 custom class들은 모두 compile time에 output에 linking 되는데 문자열로 접근을 하는 경우는 linking에서 제외됐기 때문입니다.

강제로 linking에 포함시키는 법을 찾아봐야겠지만 간단히 아래와 같이 코드에 해당 타입에 대한 선언을 추가해서 linking에 포함시킬수도 있습니다 -0-;;;

    var dummy1:mx.effects.Effect;
    var dummy2:mx.contorls.Alert;


이렇게 되면 진정한 reflection이라고 보기는 힘들겠지만 어쨌든 됩니다! 그게 중요하죠 -0-






이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 타오

트랙백 주소 :: http://taoism.tistory.com/trackback/30 관련글 쓰기

댓글을 달아 주세요

  1. 자바랑 맞짱을 뜨려는군요. 이미 짱먹고 있지만..

    • 현재는 가장 뛰어난 브라우저 RIA환경인건 사실인것 같습니다. 언어적으로도 기존 자바와 같은 컴파일 언어와 스크립트언어의 양다리를 걸치고 있어 적응이 쉬운편이구요.