下載了這個swc,號稱能夠反射出全部加載的類。已經用在了spring。spring
但是一運行就報錯,說bytearray.uncompress出錯。操。app
下載整個源碼,單獨加載as3commons-bytecode, 又發現邊用不了,依賴了一個logging,還用了CONFIG::debug這種,估計和編譯器參數綁定了。ui
刪除全部的logging以後,調試,發現如下代碼:debug
ReflectionDeserializer調試
public function read(typeCache:ByteCodeTypeCache, input:ByteArray, applicationDomain:ApplicationDomain=null, isLoaderBytes:Boolean=true):void { _applicationDomain = applicationDomain ||= Type.currentApplicationDomain; _byteStream = AbcSpec.newByteArray(); input.endian = Endian.LITTLE_ENDIAN; var swfIdentifier:String = input.readUTFBytes(3); var compressed:Boolean = (swfIdentifier == SWFWeaverFileIO.SWF_SIGNATURE_COMPRESSED); var version:uint = input.readByte(); var filesize:uint = input.readUnsignedInt(); input.readBytes(_byteStream); if (isLoaderBytes) { _byteStream.length -= 8; } if (compressed) { _byteStream.uncompress(); } _byteStream.position = 0; readHeader(_byteStream); while (_byteStream.bytesAvailable) { readTags(typeCache, _byteStream); } }
能夠看到 uncompress以前,作了一個length -= 8code
這裏是過濾掉頭的3個byte = swfid, 1個byte的version,4個byte的filesize。blog
可是你碼爲何修改length。直接致使解壓出錯。這玩意到底有沒有人用過的。因而我修改源碼:input
input.readBytes(_byteStream); if (isLoaderBytes) { // _byteStream.length -= 8; } if (compressed) { _byteStream.position = 0; _byteStream.uncompress(); }
註釋掉length,同時修改position=0.編譯器
一切正常了。源碼
的確能夠反射出全部的類,是讀bytecode得到的,比bytearray得SwfExplorer好。就是這個地方不知道做者怎麼搞的。