java字节码_好的,每个接触Java字节码的人
java字節碼
Oracle訴Google一案認為,復制Java API的結構,序列和組織是侵犯版權的行為。 侵犯版權不僅是復制行為,而且還適用于擁有該作品副本的所有中間方。
那就是編寫/編譯任何JVM語言的人,以及在他們擁有的任何設備上都有JAR文件的人,包括舊摩托羅拉翻蓋手機上的Java ME applet。 實際上,JVM的所有版本都非常普及,每個工業化國家的每個成年人都有可能在某個地方運行JVM。
而且每個非Sun / Oracle JAR文件中都嵌入了部分或全部Java API的副本,因為從技術上講,為了調用API,必須在已編譯的字節碼中包含API的影子。
讓我示范一下。
這是我編寫的一個完全合法的Java程序,我擁有以下內容的版權:
public class HelloWorld {public static void main(String[] args) {int strlen = 0;for (int x = 0; x < args.length; x++) {strlen += args[x].length();}System.out.println("Hello, world, you passed in "+args.length+" arguments, "+"total size: "+strlen);}}那里什么都沒有侵權。 我通過OpenJDK Java編譯器javac運行該程序,該程序生成一個HelloWorld.class文件。 根據業界通常使用Java和編譯器的方式,產生的字節碼是源代碼的派生作品,我擁有源代碼的版權。
因此,讓我們看一下使用javap反匯編的結果字節碼:
dpp@crown:~/proj/dpp-blog/images$ javap -c HelloWorld Compiled from "HelloWorld.java" public class HelloWorld {public HelloWorld();Code:0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V4: return public static void main(java.lang.String[]);Code:0: iconst_0 1: istore_1 2: iconst_0 3: istore_2 4: iload_2 5: aload_0 6: arraylength 7: if_icmpge 2510: iload_1 11: aload_0 12: iload_2 13: aaload 14: invokevirtual #2 // Method java/lang/String.length:()I17: iadd 18: istore_1 19: iinc 2, 122: goto 425: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;28: new #4 // class java/lang/StringBuilder31: dup 32: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V35: ldc #6 // String Hello, world, you passed in 37: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;40: aload_0 41: arraylength 42: invokevirtual #8 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;45: ldc #9 // String arguments, 47: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;50: ldc #10 // String total size: 52: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;55: iload_1 56: invokevirtual #8 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;59: invokevirtual #11 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;62: invokevirtual #12 // Method java/io/PrintStream.println:(Ljava/lang/String;)V65: return }噢,我的……看,某些Java API完全插入了代碼中。
實際上,JVM 要求調用站點(調用代碼的位置)包括有關被調用的API的信息,以便JVM找出要調用的方法。 不僅是方法名稱,而且還有傳入的參數類型和預期的返回類型。
因此,每個已編譯的JAR都包含嵌入其中的Java API的某些部分。 根據Oracle的決定,每個編譯的JAR文件都侵犯了版權。
“但是,”您說,“ JAR文件并不包含所有有爭議的API。”
首先,多少就足夠了。 Oracle法院明確拒絕了有關API僅占Java基類整體工作的一小部分,并且百分比論據沒有說服力的論點。
其次,對于像Maven Central這樣的存儲了成千上萬個JAR文件的存儲庫,基本上所有Java API都被復制到這些JAR文件中存儲的集合作品中。
該怎么辦?
如果我要托管大量的JAR文件,我會打電話給我的律師試圖弄清楚該怎么做。 是的,也許有一個引誘論據,因為Oracle分發了javac ,因此誘使我復制Java API。 但是,這仍然是對Oracle法院判決的技術性違反。
如果我是Apache Software Foundation或Free Software Foundation,我將在今天早上提出單方面請求以中止 Oracle的決定,因為這意味著我們一直在考慮的是可以在其上進行許可的軟件我們的開放條款實際上包含Oracle版權代碼,我們將不得不暫停所有與JVM相關的開源項目。
哦,我要指出的是,如果Oracle聲稱復制到JAR文件中的API不受版權保護,那么Google要做的就是從Maven Central中提取所有JAR文件,在所有這些API中找到所有Java API引用。 JAR文件,并使用該信息聲明適用于Android的API。 最多大約要花10個工作日。
翻譯自: https://www.javacodegeeks.com/2014/05/okay-everybody-who-touches-java-bytecode.html
java字節碼
總結
以上是生活随笔為你收集整理的java字节码_好的,每个接触Java字节码的人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq农场助手安卓版下载电脑版下载安装(q
- 下一篇: Excel表格如何进入打印预览和设置Ex