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字节码的人相关推荐

  1. java字节码_好的,每个接触Java字节码的人

    java字节码 Oracle诉Google一案认为,复制Java API的结构,序列和组织是侵犯版权的行为. 侵犯版权不仅是复制行为,而且还适用于拥有该作品副本的所有中间方. 那就是编写/编译任何JV ...

  2. 如何阅读JAVA 字节码(一)

      在阅读JAVA字节码以前,需要回忆一下JVM的结构:   Java字节码的信息主要在Java栈中间体现,下图来自网络,描述了java栈的基本结构:   值得注意的是方法区,在Java虚拟机中,方法 ...

  3. 通过Java字节码发现有趣的内幕之String篇(上)(转)

    原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知 ...

  4. 字节跳动_掌握Java字节码

    字节跳动 嘿! 来临快乐:D我是ZeroTurnaround的技术布道者Simon Maple( @sjmaple) . 您知道, JRebel伙计们! 由于编写了类似JRebel的产品,该产品与字节 ...

  5. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  6. Java字节码进制转换

    在理解二进制和十进制.十六进制时发现的,作为后续参考保存! public class codeCon {/*** 字符串转换成十六进制值* @param bin String 我们看到的要转换成十六进 ...

  7. 3种骚操作,教你查看 Java 字节码!

    在我们工作.学习.以及研究 JVM 过程当中,不可避免的要查看 Java 字节码,通过查看字节码可以了解一个类的编译结果,也能通过编译器层面来分析一个类的性能. 字节码文件是不能直接打开的,下面栈长教 ...

  8. Java字节码(.class文件)格式详解(一)

    原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...

  9. JAVA字节码指令iload_n为什么只有0到3?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 来源:r6d.c ...

最新文章

  1. 全国“最高”的视觉竞赛,华为Atlas打通遥感图像智能分析任督二脉
  2. Linux 远程登录
  3. 挨踢(IT)脱口秀--2014年2015上半年特别“任性”的网络流行语大盘点
  4. LBS突围:从微信到微博
  5. C++求复数的角度_【研读.教材分析】“勾股定理”教学——基于单元整体的角度再思考...
  6. 《软件需求模式》阅读笔记二
  7. 2015 ACM Syrian Collegiate Programming Contest
  8. 打印机、惠普打印机扫描分辨率低,扫描出来模糊,解决办法
  9. EDI只能传输标准的EDI报文吗?
  10. 浅析数据中心存储发展趋势
  11. 在windows和Linux上安装ImageMagick与jmagick,Maven配置、Java图片压缩代码(整理网上、结合自己情况、编写出来的新安装方式)
  12. ★如何解释特修斯之船问题?
  13. JAVA图形化界面设计
  14. 计算机应用基础教程ppt 洪歧,计算机应用基础案例教程(清华)
  15. 基于Linux系统部署新世纪版五笔输入法
  16. 使用动态规划弹性扩容机器。使用拉链法O(N)求所有集合
  17. JZOJ 1285. 奶酪厂
  18. RFSoC应用笔记 - RF数据转换器 -10- RFSoC关键配置之其他功能(一)
  19. 测试服务器运行温度,负载、功耗、温度测试结果
  20. python 形态学

热门文章

  1. Linux中安装nc(netcat)常见问题
  2. android之微信分享文本
  3. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项
  4. super构造方法为什么给子类赋值_【Java学习 | Javase】super
  5. java本地监听zk服务器节点【动态上下线】
  6. 包+类导入+静态导入+类放入包中+包作用域
  7. JDK7的日期时间类
  8. jdk8 npe_JDK 14中更好的NPE消息
  9. rest post put_REST / HTTP方法:POST与PUT与PATCH
  10. spring 计划任务_与Spring的计划任务一起按时运行