Re: [问题] java byte code问题

楼主: sbrhsieh (十年一梦)   2014-12-29 20:52:56
※ 引述《kdok123 (小天)》之铭言:
: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
: 连结为java bytecode instruction listings
: 有个三个疑问想问:
: getstatic :
: get a static field value of a class, where the field is identified by field
: reference in the constant pool index (index1 << 8 + index2)
: 后面括号index1 << 8 + index2 是什么意思?
getstatic instruction 后面有接着两个 bytes 的 index,暂时以 index1, index2
称这两个 bytes,括号部分为 interpret 这两个 bytes 为一个 index 数值的方式。
(换句话说把两个 byte 皆以 unsigned int 解读为 index1, index2,则 field ref
在 constant pool 的 index 为 index1 * 2^8 + index2。
: invokespecial :
: invoke instance method on object objectref, where the method is identified by
: method reference index in constant pool (indexbyte1 << 8 + indexbyte2)
: 这边的objectref 是什么意思?
: 每次只要new的时候都会有这行,是什么原因?(跟instance method的关系?)
在 JVM stack 里的数值扣除掉 int/long/float/double 这些 primitive type,剩的
都是 objectref(你可以看成 JAVA PL 里的 reference value)。
Java new operator 的作用包含 object allocation 与 object initialization,
当 Java 程式码里出现有出现 new SomeClass(...) 的 expression,编译产出的
bytecode 就会包含一个 new instruction(object allocation),以及一个
invokespecial instruction 来执行该 object 所属 class 所定义的某个
constructor(object initialization)。
: invokevirtual:
: invoke virtual method on object objectref, where the method is identified by
: method reference index in constant pool (indexbyte1 << 8 + indexbyte2)
: 每次call method的时候也会产生这行,连自定义的method也是(自定义的method跟
: virtual method有什么关系?)
: 请教大家了
在 Java PL 中,扣掉 static method、constructor 与 private method,其他的
method 都是 virtual function(method)。
invoke static method 是透过 invokestatic instruction,invoke constructor、
private method 与 overriden method 是 invokespecial instruction,其他的
method 被调用都是使用 invokevirtual instruction(假如 objectref 是某种
interface,而被调用 method 有定义在此 interface 里,那么使用的 instruction
是 invokeinterface)。
class Bar {
public void foobar() {...}
}
class Foo implements Runnable {
private void runImpl() {...}
public void run() {
runImpl(); // invokespecial
}
public static Foo create() {
return new Foo(); // invokespecial for Foo() constructor
}
public void foobar() {
super.foobar(); // invokespecial
}
public static void main(String[] args) {
Foo a = create(); // invokestatic
Runnable r = a;
a.run(); // invokevirtual
r.run(); // invokeinterface
}
*Java 1.7(Java 7) 有引进一个新的 invokedynamic instruction。这部分可以
暂时先略过,以后再看看。
作者: kdok123 (小天)   2014-12-30 11:09:00
谢谢你! 好厉害,写的真清楚! 感谢!!

Links booklink

Contact Us: admin [ a t ] ucptt.com