JVM-理解字节码执行引擎

基本指令
  • astore_n: 栈顶引用型数值存入第n个本地变量
  • invokespecial:
  • invokevirtual: 普通方法调用
  • dup: 复制栈顶数值并将复制值压入栈顶
  • ldc: 推送常量到栈顶
  • aload_n:将第n个引用类型的变量推送到栈顶
实例分析
Java源码

package jvm;
public class Language {
public int count = 1;
public String getContent() {
return “hello world”;
}
public String getContent2() {
return “hello world 2”;
}
}

public class Person {
private final String name = “person”;
private final Language mLanguage = new Language();

public void say() {
System.out.println("Person say " + mLanguage.getContent());
}

public static void main(String[] args) {
Person person = new Person();
person.say();
}
}

javap -v Person 输出

public class jvm.Person
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #18.#33 // java/lang/Object.“”😦)V
#2 = String #34 // person
#3 = Fieldref #15.#35 // jvm/Person.name:Ljava/lang/String;
#4 = Class #36 // jvm/Language
#5 = Methodref #4.#33 // jvm/Language.“”😦)V
#6 = Fieldref #15.#37 // jvm/Person.mLanguage:Ljvm/Language;
#7 = Fieldref #38.#39 // java/lang/System.out:Ljava/io/PrintStream;
#8 = Class #40 // java/lang/StringBuilder
#9 = Methodref #8.#33 // java/lang/StringBuilder.“”😦)V
#10 = String #41 // Person say
#11 = Methodref #8.#42 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#12 = Methodref #4.#43 // jvm/Language.getContent:()Ljava/lang/String;
#13 = Methodref #8.#44 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#14 = Methodref #45.#46 // java/io/PrintStream.println:(Ljava/lang/String;)V
#15 = Class #47 // jvm/Person
#16 = Methodref #15.#33 // jvm/Person.“”😦)V
#17 = Methodref #15.#48 // jvm/Person.say:()V
#18 = Class #49 // java/lang/Object
#19 = Utf8 name
#20 = Utf8 Ljava/lang/String;
#21 = Utf8 ConstantValue
#22 = Utf8 mLanguage
#23 = Utf8 Ljvm/Language;
#24 = Utf8
#25 = Utf8 ()V
#26 = Utf8 Code
#27 = Utf8 LineNumberTable
#28 = Utf8 say
#29 = Utf8 main
#30 = Utf8 ([Ljava/lang/String;)V
#31 = Utf8 SourceFile
#32 = Utf8 Person.java
#33 = NameAndType #24:#25 // “”😦)V
#34 = Utf8 person
#35 = NameAndType #19:#20 // name:Ljava/lang/String;
#36 = Utf8 jvm/Language
#37 = NameAndType #22:#23 // mLanguage:Ljvm/Language;
#38 = Class #50 // java/lang/System
#39 = NameAndType #51:#52 // out:Ljava/io/PrintStream;
#40 = Utf8 java/lang/StringBuilder
#41 = Utf8 Person say
#42 = NameAndType #53:#54 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#43 = NameAndType #55:#56 // getContent:()Ljava/lang/String;
#44 = NameAndType #57:#56 // toString:()Ljava/lang/String;
#45 = Class #58 // java/io/PrintStream
#46 = NameAndType #59:#60 // println:(Ljava/lang/String;)V
#47 = Utf8 jvm/Person
#48 = NameAndType #28:#25 // say:()V
#49 = Utf8 java/lang/Object
#50 = Utf8 java/lang/System
#51 = Utf8 out
#52 = Utf8 Ljava/io/PrintStream;
#53 = Utf8 append
#54 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#55 = Utf8 getContent
#56 = Utf8 ()Ljava/lang/String;
#57 = Utf8 toString
#58 = Utf8 java/io/PrintStream
#59 = Utf8 println
#60 = Utf8 (Ljava/lang/String;)V
{
private final java.lang.String name;
descriptor: Ljava/lang/String;
flags: ACC_PRIVATE, ACC_FINAL
ConstantValue: String person

private final jvm.Language mLanguage;
descriptor: Ljvm/Language;
flags: ACC_PRIVATE, ACC_FINAL

public jvm.Person();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object.“”😦)V
4: aload_0
5: ldc #2 // String person
7: putfield #3 // Field name:Ljava/lang/String;
10: aload_0
11: new #4 // class jvm/Language
14: dup
15: invokespecial #5 // Method jvm/Language.“”😦)V
18: putfield #6 // Field mLanguage:Ljvm/Language;
21: return
LineNumberTable:
line 3: 0
line 5: 4
line 6: 10

public void say();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
// 拿到一个静态对象
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
// new三兄弟又出现了
3: new #8 // class java/lang/StringBuilder
6: dup

Android开发除了flutter还有什么是必须掌握的吗?

相信大多数从事Android开发的朋友们越来越发现,找工作越来越难了,面试的要求越来越高了

除了基础扎实的java知识,数据结构算法,设计模式还要求会底层源码,NDK技术,性能调优,还有会些小程序和跨平台,比如说flutter,以思维脑图的方式展示在下图;

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
r,以思维脑图的方式展示在下图;

[外链图片转存中…(img-POcaCLl2-1715842979600)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值