标签: bytecode

将Java代码降级1.5到1.4(奖励积分:J2ME,Blackberry !!!)

我想移植一些现有的j2se库(例如Apache Compression libs)来用于Blackberry开发,但是有一个问题(而不仅仅是一个).

首先,大多数java库广泛使用j2me平台上通常缺少的j2se集合和数据类型 - 但由于Apache Harmony这样的开源j2se api实现,这在理论上是可解决的.更大的问题是,看起来,Blackberry JDK基于java 1.4,所以任何使用泛型和其他1.5功能的代码,如Enums,都不能毫不费力地在Blackberry上编译.

这提出了一个有趣的问题,即是否有任何现有的工具或项目可以进行自动1.5-> 1.4转换,同时支持j2me-bastardized字节码:)

我能找到的一个项目是Retroweaver,但我不太确定该项目有多活跃.

我敢肯定1.5-> 1.4自动转换的问题并不是唯一的 - 所以有人有这方面的经验吗?

java bytecode downgrade java-me

7
推荐指数
2
解决办法
1859
查看次数

为什么javac checkcast阵列两次?

检查字节码,我注意到javac似乎checkcast在转换为数组类型时复制指令.

Cast.java:
class Cast {
  void test(Object a) {
    Object[] b = (Object[])b;
  }
}
Run Code Online (Sandbox Code Playgroud)

javap反汇编的javac编译版本

void test(java.lang.Object);
  Code:
   0:   aload_1
   1:   checkcast   #2; //class "[Ljava/lang/Object;"
   4:   checkcast   #2; //class "[Ljava/lang/Object;"
   7:   astore_2
   8:   return
Run Code Online (Sandbox Code Playgroud)

测试jikes显示预期的单演员

void test(java.lang.Object);
  Code:
   0:   aload_1
   1:   checkcast   #10; //class "[Ljava/lang/Object;"
   4:   astore_2
   5:   return
Run Code Online (Sandbox Code Playgroud)

checkcast如果对象不能被视为请求的类型而不执行任何操作,则应该引发异常,因此我不明白为什么它可能有助于使转换加倍.我没有看过JDK的来源,看看它是如何产生的,如果这有助于解释原因(也许这意味着它的暗示).

jvm bytecode javac jikes

7
推荐指数
1
解决办法
321
查看次数

使用Haskell将函数注入Java .class文件

我使用Haskell编写了一个Java字节码解析器,它运行得很好.然而,下一步让我完全难过.

我的Haskell程序需要修改.class文件,以便在执行时,Java程序打印:

" 在执行方法之前输入[此处的方法名称] ",和

执行方法后" 退出[此处的方法名称] ".

我所知道的是,我们需要在调用时附加常量池和方法表System.out.println,但我觉得我仍然缺少某些东西.

  • 解决这个问题的最佳方法是什么?
  • 你怎么知道如何调用System.out.println字节码?
  • 如何使用方法名称存储字符串,以后将其作为参数调用System.out.println?

java haskell bytecode code-injection

7
推荐指数
1
解决办法
525
查看次数

为一元not表达式生成JVM字节码

假设您正在编写Java(或Java子集)编译器,并且您希望为一元表达式生成字节码,!E.你已经过了类型检查,所以你知道E有类型boolean,即它会将一个1或一个0打开到操作数堆栈.

一种方法是(在Jasmin语法中):

E
ifeq truelabel
iconst_0
goto stoplabel
truelabel:
iconst_1
stoplabel:
Run Code Online (Sandbox Code Playgroud)

即如果堆栈上有一个0按1,则按0.另一种方法,利用a boolean只是一个int有价值的事实,1或者0说,!E = (E + 1) % 2并生成

E
iconst_1
iadd
iconst_2
irem
Run Code Online (Sandbox Code Playgroud)

使用一个优于另一个是否有优势?或完全不同的东西?

java compiler-construction jvm bytecode javac

7
推荐指数
2
解决办法
3470
查看次数

为什么用于.NET的Scala编译器忽略了val的含义?

我正在玩Scala.我发现了3个有趣的东西(标题是第三个).

1声明为val的局部变量不会被解释为final.

class HowAreVarAndValImplementedInScala {
  var v1 = 123
  val v2 = 456

  def method1() = {
    var v3 = 123
    val v4 = 456
    println(v3 + v4)
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我将上面的scala代码编译成字节码,然后将其反编译成java,它看起来像这样:

public class HowAreVarAndValImplementedInScala
{
  private int v1 = 123;
  private final int v2 = 456;

  public int v1()
  {
    return this.v1;
  }

  public void v1_$eq(int x$1) { this.v1 = x$1; }

  public int v2() { return this.v2; }

  public void method1() {
    int v3 = 123;
    int v4 = …
Run Code Online (Sandbox Code Playgroud)

c# java cil scala bytecode

7
推荐指数
1
解决办法
825
查看次数

在java检测中使用agentmain方法有什么用处

我用-javaagent参数和premain方法做了一些java字节码检测.但这是我第一次听到agentmain方法.我对这个方法有一些疑问.接下来是这样的.

premain和agentmain方法有相同的用途吗?
调用agentmain方法时?
在java检测中使用agentmain方法有什么用?

instrumentation profiling bytecode javaagents

7
推荐指数
1
解决办法
4233
查看次数

从抽象语法树生成基于寄存器的字节码?

从给定的anstract语法树(AST)生成基于寄存器的字节码有哪些众所周知的策略?

考虑这个表达式1 + 2 - 3 * 4 / 5及其AST形式:

bin_exp(-)
    bin_exp(+)
        num_exp(1)
        num_exp(2)
    bin_exp(/)
        bin_exp(*)
            num_exp(3)
            num_exp(4)
        num_exp(5)
Run Code Online (Sandbox Code Playgroud)

我正在努力将AST转换为相应的字节码.到目前为止,我只发现了一篇文章,其中仅简要介绍了它.我对它试图说的内容的解释......

int ridx; // register index

function visit_exp(exp)
{
    switch (exp)
    {
        case bin_exp:
            visit_exp(exp.left);
            visit_exp(exp.right);

            printf("add %i, %i -> %i\n", ridx - 2, ridx - 1, ridx);

            // save ridx, as it contains the result
                    break;
        case num_exp:
            printf("mov %i -> %i\n", ridx, exp.value);
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮帮我,谢谢.

compiler-construction code-generation bytecode abstract-syntax-tree

7
推荐指数
1
解决办法
1084
查看次数

为什么OpenJDK将私有方法放入vtable?

看来,OpenJDK的8位私有方法不属于final也不static成虚函数表.为什么当动态绑定不用于私有方法时(因为它们是用invokespecial调用的)或是否使用它?

java openjdk jvm bytecode

7
推荐指数
1
解决办法
198
查看次数

字节码和汇编语言是一回事吗?

这个问题可能看起来很奇怪,但我仍然试图掌握虚拟机的概念.我已经阅读了几个答案,但是如果Java字节码(以及MSIL)与汇编语言相同,我仍然无法得到.据我所知,字节码和汇编都被编译成机器码,所以从抽象的角度讲,它们处于同一级别,即比机器码高出一步.字节码也只是汇编语言,即人类可读的机器代码形式.如果是,那么为什么仍然使用汇编语言?为什么不用字节码(可以在不同的机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢

assembly cil bytecode virtual-machine machine-code

7
推荐指数
1
解决办法
1108
查看次数

为什么java字节码"存储"通常后跟"加载"?

当我从一些小的java函数中读取jvm字节码时,我发现当一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作?

java bytecode jvm-bytecode

7
推荐指数
2
解决办法
468
查看次数