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字节码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用WireMock进行更好的集成测试

无论您是遵循传统的测试金字塔还是采用诸如“ 测试蜂窝”这样的较新方法&#xff0c;都应该在开发过程中的某个时候开始编写集成测试。 您可以编写不同类型的集成测试。 从持久性测试开始&#xff0c;您可以检查组件之间的交互&#xff0c;也可以模拟调用外部服务。 本文将讨论…

Acwing刷题第一节

756 题目分析 &#xff1a; 要点如下&#xff1a; 1. 矩阵遍历&#xff1a;确定遍历方向 2. 确定遍历边界 #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N 110; int n,m; int res[N][N];int main() {…

Jetty,Java和OAuth入门

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 Jetty是一个小型&#xff0c;高度可扩展的基于Java的Web服务器和servlet引擎。 它支持HTTP / 2&#xff0c;WebSocket…

vscode 设置 sublime 的主题

vscode 怎么设置 sublime 的主题&#xff1f; VsCode中提供多种主题样式&#xff0c;供使用者选择。 由于习惯于Sublime默认主题&#xff0c;因此将VsCode主题更换为Sublime默认主题。 首先点击编辑器顶部导航菜单中的【文件】&#xff1b; 然后点击【首选项】下【颜色主题】…

VsCode与Sublime编辑器优缺点对比

一 VS code与Sublime共同点 文本功能强大&#xff0c;支持各种语言高亮支持编译&#xff0c;且可以在控制台看到输出可安装大量插件 二 VsCode优点 1. 插件管理成熟 插件很多&#xff0c;近vscode发展势头猛&#xff0c;安装插件方便简单&#xff0c;有插件的详细介绍 vscode新…

spring预加载与懒加载_通过Spring将继承树加载到List中

spring预加载与懒加载我注意到有趣的Spring功能。 我的一位同事使用它将Spring Bean的整个继承树加载到列表中。 在学习Spring文档时错过了这一点。 让我们来看看Spring bean的继承树&#xff1a; 下面的代码片段是通过构造函数注入将此豆树加载到列表中的&#xff1a; Comp…

VsCode连接远程服务器并修改文件代码

一 插件安装配置 1. 安装远程开发插件Remote Development&#xff0c;在商店中搜索Remote Development并安装。 2、选择SSH Targets 安装完成后&#xff0c;vscode左侧多出了一个菜单栏&#xff0c;我们点击配置按钮配置远程服务器的地址。选择SSH Targets。 二 远程服务器配…

Java和Round-Robin上的AtomicInteger

AtomicInteger属于Atomic Variables族。 主要好处是使用它不会阻塞而不是进行阻塞同步&#xff0c;因此避免了线程的挂起和重新调度。 AtomicInteger基于“比较和交换”机制&#xff0c;并且是原子变量的标量组的一部分。 我们的第一个用例是可以多次访问的网页上的功能。 pa…

VsCode打开终端的方法

方法1&#xff1a;打开终端的常规方法 打开VScode后&#xff0c;鼠标左键单击窗口顶部的【查看】&#xff08;如下图红圈标注&#xff09;&#xff0c; 在下拉列表中找到【终端】&#xff08;如下图红框标注&#xff09; 鼠标左键点击【终端】即可打开终端子窗口&#xff0c;如…

Ubuntu下VScode配置ssh免密远程登录

一 实现步骤 1.在本机与远程服务器上&#xff0c; 输入ssh-keygen -t rsa&#xff0c;然后连续回车直到结束 2.在本机上执行命令 ssh-copy-id 命令 &#xff08;1&#xff09;.命令介绍 ssh-copy-id命令可以把本地的ssh公钥文件安装到远程主机对应的账户下。 达到的功能&am…

VSCode隐藏左边活动栏

用sublime时间较长&#xff0c;VsCode左边的活动栏看上去有些多余。查询隐藏活动栏的快捷键&#xff0c;但没有找到。通过vscode怎么隐藏左边栏&#xff1f; - 知乎有快捷键可以隐藏左边栏么&#xff1f;https://www.zhihu.com/question/48285162 问题&#xff0c;找到相关处理…

java 从未导入_Java 8的10个您从未听说过的功能

java 从未导入Lambdas lambdas lambdas。 这是您在谈论Java 8时所听到的所有信息。但这只是一部分。 Java 8具有许多新功能-一些功能强大的新类和习惯用法&#xff0c;而另一些则是从一开始就应该存在的功能。 我想介绍十个新功能&#xff0c;我认为这些功能绝对是值得了解的小…

删除当前路径下含某个关键字的所有文件

一 查找含关键字的所有文件名 此处拿"T5"举例 1. 使用ls命令查找 ls -R | grep T5 # -R 显示文件夹内部所有文件 2. 使用find命令 find . -name "*T5*" 二 将查找到的文件删除 find . -name "*T5*" |xargs rm -rf xargs - build and exec…

Typora设置标题自动标号

Typora由于默认标题无法自动标号&#xff0c;每次编辑时需要手动处理。为实现标题自动编号&#xff0c;需要进行相关操作。 一 官方说明 To achieve this, add the following to your base.user.css or [theme].user.css in the theme folder. /** initialize css counter */ …

捕获Java堆转储的7个选项

堆转储是诊断与内存相关的问题的重要工件&#xff0c;例如内存泄漏缓慢&#xff0c;垃圾回收问题和java.lang.OutOfMemoryError。它们也是优化内存消耗的重要工件。 有很多很棒的工具&#xff0c;例如Eclipse MAT和Heap Hero&#xff0c;可以分析堆转储。 但是&#xff0c;您需…

Ubuntu对CPU进行测试

一 用 stress 工具对CPU进行压力测试 1.软件安装 sudo apt-get update #日常先更新再安装东西不容易出错 #下一條語句可以省略 sudo apt-get install -y linux-tools-$(uname -r) #系统基本功能安装 sudo apt-get install stress #安装stress软件 sudo stress -c 2 -t 100 …

第一章 基础算法(一)

文章目录排序快速排序--分治归并排序二分整数二分浮点数二分整体框架排序 快速排序–分治 785题目&#xff1a; 给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式 输入共两行&#xff0c;第一行包含整数…

java8hashmap_Java 8中的HashMap性能改进

java8hashmapHashMap<K, V>是每个Java程序中快速&#xff0c;通用且无处不在的数据结构。 首先是一些基础知识。 您可能知道&#xff0c;它使用键的hashCode()和equals()方法在存储桶之间拆分值。 存储桶&#xff08;箱&#xff09;的数量应略高于映射中的条目数&#xf…

装前必看施工干货,贴瓷砖的5大步骤。福州中宅装饰,福州装修

亲爱的朋友们&#xff0c;你们是否曾经在装修房屋时遇到过贴砖的难题呢&#xff1f;贴砖可是装修工程中一项重要的工艺&#xff0c;它直接影响到整个装修的效果和质量。今天&#xff0c;我就来跟大家分享一下贴砖的几个重要要点&#xff0c;希望对你们有所帮助。 1️⃣ 选材是关…