我想移植一些现有的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自动转换的问题并不是唯一的 - 所以有人有这方面的经验吗?
检查字节码,我注意到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的来源,看看它是如何产生的,如果这有助于解释原因(也许这意味着它的暗示).
我使用Haskell编写了一个Java字节码解析器,它运行得很好.然而,下一步让我完全难过.
我的Haskell程序需要修改.class文件,以便在执行时,Java程序打印:
" 在执行方法之前输入[此处的方法名称] ",和
执行方法后" 退出[此处的方法名称] ".
我所知道的是,我们需要在调用时附加常量池和方法表System.out.println,但我觉得我仍然缺少某些东西.
System.out.println字节码? System.out.println?假设您正在编写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)
使用一个优于另一个是否有优势?或完全不同的东西?
我正在玩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) 我用-javaagent参数和premain方法做了一些java字节码检测.但这是我第一次听到agentmain方法.我对这个方法有一些疑问.接下来是这样的.
premain和agentmain方法有相同的用途吗?
调用agentmain方法时?
在java检测中使用agentmain方法有什么用?
从给定的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
看来,OpenJDK的8位私有方法不属于final也不static成虚函数表.为什么当动态绑定不用于私有方法时(因为它们是用invokespecial调用的)或是否使用它?
这个问题可能看起来很奇怪,但我仍然试图掌握虚拟机的概念.我已经阅读了几个答案,但是如果Java字节码(以及MSIL)与汇编语言相同,我仍然无法得到.据我所知,字节码和汇编都被编译成机器码,所以从抽象的角度讲,它们处于同一级别,即比机器码高出一步.字节码也只是汇编语言,即人类可读的机器代码形式.如果是,那么为什么仍然使用汇编语言?为什么不用字节码(可以在不同的机器上移植)而不是汇编语言(特定于单个机器架构)进行编程?谢谢
当我从一些小的java函数中读取jvm字节码时,我发现当一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作?