當Java(或任何能夠反射的語言)輸出程序時,它是否將方法的名稱保存爲字節碼中的字符串?反射是否需要在字節碼之間寫入文字字符串?
我不知道如何,例如,以下是可能沒有這個既然如此:
Class c = Class.forName("foo");
Method m[] = c.getDeclaredMethods();
將字節碼則包含類中的每個方法和字段名的字符串?我想知道,因爲我想確保我的代碼的所有部分不容易被讀取,而不必混淆一切。如果我對反思的理解存在根本性錯誤,請告訴我。
當Java(或任何能夠反射的語言)輸出程序時,它是否將方法的名稱保存爲字節碼中的字符串?反射是否需要在字節碼之間寫入文字字符串?
我不知道如何,例如,以下是可能沒有這個既然如此:
Class c = Class.forName("foo");
Method m[] = c.getDeclaredMethods();
將字節碼則包含類中的每個方法和字段名的字符串?我想知道,因爲我想確保我的代碼的所有部分不容易被讀取,而不必混淆一切。如果我對反思的理解存在根本性錯誤,請告訴我。
首先,方法,字段和類名作爲明文存儲在.class文件中。
其次,除了反射,還有java反編譯器,可以從字節碼恢復幾乎可讀的代碼。
第三如果你想保護你的代碼使用混淆。有幾種流行的java obfuscatotors可用。
我是否認爲沒有辦法阻止代碼與反射行爲進行編譯?我猜想混淆可以防止竊取代碼,因爲需要花費大量的時間來辨別代碼,但它仍然感覺像是某種安全漏洞。 – 2011-06-06 22:24:55
你說得對。儘管可以通過使用各種技術(如動態代理,動態加載代碼的某些部分等)來「雙重代碼」代碼。如果您確實希望甚至可以在客戶端計算機上只安裝一個將上網的小型加載器,請下載完整的應用程序作爲ecrypted(密碼保護)zip每次啓動應用程序。這個機制可能是非常安全的,我從未見過有人實施它。 – AlexR 2011-06-15 15:39:43
是的,每個字段都會包含全名。如果你想混淆你的代碼,你需要使用一個混淆程序(儘管這也不完全安全,但它們可以在運行時輕鬆讀取)。
正如前面的答案所提到的,當Java被翻譯/編譯爲Java Bytecode(一個「Java程序」)時,ids。被存管。
既然你提到「其他語言」:
如果他們的目標相同的Java虛擬機,然後這些語言也會產生與名稱Java字節碼。
我不確定,但是,我相信「.NET」語言不會直接在其程序中生成id,並且有Java和J.V.M新版本的提議或原型。 (Java 7,Java 8)使用數字或代碼而不是普通名稱,這既是爲了安全性,也是爲了使程序更快速和優化。
有一個(數字/印刷)書:「Java虛擬機規範」,其中字節碼提到了class ID。如果您有興趣,我認爲您仍然可以免費從Sun-Oracle下載,或在亞馬遜購物。
是的。反編譯java字節碼非常容易,甚至是混淆的字節碼。 – irreputable 2011-06-06 20:28:08