as3commons-bytecode 獲取全部類的一個BUG

下載了這個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好。就是這個地方不知道做者怎麼搞的。

相關文章
相關標籤/搜索