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>":()V
       4: 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     25
      10: iload_1       
      11: aload_0       
      12: iload_2       
      13: aaload        
      14: invokevirtual #2                  // Method java/lang/String.length:()I
      17: iadd          
      18: istore_1      
      19: iinc          2, 1
      22: goto          4
      25: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      28: new           #4                  // class java/lang/StringBuilder
      31: dup           
      32: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
      35: 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;)V
      65: 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字节码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值