测试

周志明老师的《深入理解java虚拟机》


字节码指令构成

学类文件结构的时候,在方法表的属性表的 Code 属性表中的 code 属性中,我们知道 code 属性就是保存方法编译以后的字节码指令的。其中 code 属性是 u1 类型的,占用一个字节,这一个字节表达的数字叫做 操作码。每个操作码后面跟随的零个或多个参数,称为 操作数 。字节码指令由它们构成。

字节码指令 = 操作数 + 操作码 ;

其中 java 虚拟机采用面向操作数栈的架构,因此,大部分指令都只有一个操作码,没有参数部分的操作数。这里仅需要知道 java 采用的是基于操作数栈的架构即可,理由在书的第八章会讲。


字节码指令集的特点

没看懂(Class 文件放弃了编译后代码的操作数长度对齐 这句话。。。。)


字节码与数据类型

大部分的指令,都包含了操作对应的数据类型信息。

比如 iload ,表示从局部变量表中加载 int 类型的数据到操作数栈中。而 fload 则表示从局部变量表中加载 float 类型的数据到操作数栈中。在 Class 文件中,这两种操作对用两条不一样的指令,但是在 JVM 内部实现的时候,这两条指令可以由同一段代码完成。

其中与数据类型有关的指令,它的操作码中都有特殊的助记符表明操作哪种数据类型,如 i 代表 int ,f 代表 float 等。

助记符操作的类型
bbyte
cchar
sshort
iint
ffloat
ddouble
llong
areference

只有最后的 引用类型 referencea 需要记下,其他的都是类型的第一个字母。

还有一些与数据类型无关的操作码 arraylength ,它操作的就是 数组 。

class cglibProxy implements MethodInterceptor {

    /**
     * @param o           生成的代理类
     * @param method      调用的方法
     * @param objects     参数
     * @param methodProxy 方法代理
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println(o.getClass().getName());
        System.out.println(methodProxy.getClass().getName());

        Object result = methodProxy.invokeSuper(o, objects);
        return result;
    }
}

转载于:https://www.cnblogs.com/young-youth/articles/11398927.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值