首页 > 编程语言 >Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解

时间:2024-09-04 22:52:42浏览次数:12  
标签:文件 插件 Java 字节 jclasslib 操作数 注解 public

文章目录

一、字节码文件

  • 1.1 以正确的方式打开文件
  • 1.2 字节码文件的组成
  • 1.2.1 基础信息
  • 1.2.2 常量池
  • 1.2.3 方法
  • 1.3 字节码常用工具
  • 1.4 总结

二、Java注解

  • 2.1 什么是Java注解
  • 2.2 注释和注解Annotation的区别(掌握)
  • 2.3 如何使用注解(掌握)
  • 2.4 Java中已经存在的注解(掌握)
  • 2.5 自定义注解(了解)
  • 2.6 注解小结

一、字节码文件

1.1 以正确的方式打开文件

字节码文件中保存了源代码编译之后的内容,以二进制的方式存储,无法直接用记事本打开阅读。通过NotePad++使用十六进制插件查看class文件:

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数

推荐使用jclasslib工具查看字节码文件。Github地址:

https://github.com/ingokegel/jclasslib

选择右侧的Releases发行版本,下载对应安装包,傻瓜式安装。

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_02

1.2 字节码文件的组成

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_03

  • 基础信息:魔数、字节码文件对应的Java版本号,访问标识(public final等等),父类和接口
  • 常量池:保存了字符串常量、类或接口名、字段名,主要在字节码指令中使用
  • 字段:当前类或接口声明的字段信息
  • 方法:当前类或接口声明的方法信息,字节码指令
  • 属性:类的属性,比如源码的文件名、内部类的列表等

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_Java_04

1.2.1 基础信息

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_05

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_Java_06

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_jvm_07

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_08


1.2.2 常量池

字节码文件中常量池的作用:避免相同的内容重复定义,节省空间。

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_09

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_10

1.2.3 方法

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_11

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_12


  • 操作数栈是临时存放数据的地方(比如1+2 操作数栈就存放1、2,通过加法指令将两个数累加,结果也放到操作数栈中),局部变量表是存放方法中的局部变量的位置
  • iconst\_0、istore\_1为字节码,不是汇编;汇编指令是mov、cmp、pop这些
  • iconst\_0:iconst_常量值。将常量0放入操作数栈
  • istore\_1:istore_数组下标。从操作数栈取出放入局部变量表1号位置(操作栈数据弹出、放入局部变量表,栈中数据没有了)
  • iload\_1:iload_数组下标。将局部变量表1中的数据放入操作数栈(将局部变量表中的数据复制了1份、再放到操作数栈中,两边数据都有)

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_jvm_13

通过jclasslib打开字节码文件,查看Code的LocalVariableTable

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_Java_14

  • iconst\_0:iconst_常量值。将常量0放入操作数栈
  • istore\_1:istore_数组下标。从操作数栈取出放入局部变量表1号位置(操作栈数据弹出、放入局部变量表,栈中数据没有了)
  • iload\_1:iload_数组下标。将局部变量表1中的数据放入操作数栈(将局部变量表中的数据复制了1份、再放到操作数栈中,两边数据都有)

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_15

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_16

i=i++的执行流程:

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_17

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_18

i=++i的执行流程:(与i=i++的区别,iinc 1 by 1指令在iload_1之前)

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_jvm_19

int i = 0;
i = i++;

最终i的值是多少?

答案是0.我通过分析字节码指令发现,i++先把0取出来放入临时的操作数栈中;接下来对i进行加1,i变成了1;最后再将之前保存的临时值0放入i,最后i就变成了0。

问题:通过字节码指令分析下面三种”加一“的操作性能的高低?(一般字节码越长,操作性能越低)

public class Demo3 {
    public static void main(String[] args) {
        int i=0, j=0, k=0;
        i++;
        j = j + 1;
        k += 1;
    }
}
0 iconst_0
 1 istore_1
 2 iconst_0
 3 istore_2
 4 iconst_0
 5 istore_3
 
 6 iinc 1 by 1
 
 9 iload_2
10 iconst_1
11 iadd
12 istore_2

13 iinc 3 by 1
16 return

1.3 字节码常用工具

1)javap -v命令

  • javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件内容(一般只有运维人员有权限)
  • 直接输入javap查看所有参数
  • 输入javap -v 字节码文件名称查看具体的字节码信息(如果jar包需要先使用jar -xvf xxx.jar命令解压)。将字节码信息放到一个文件中,javap -v path/User.class > /path1/User.txt

2)jclasslib插件

  • jclasslib也有Idea插件版本,建议开发时使用Idea插件版本,可以在代码编译之后实时看到字节码文件内容
  • IDEA选中源代码文件,View-->Show Bytecode WIth Jclasslib。否则可能没有Show Bytecode WIth Jclasslib选项
  • 如果java代码有变动、而字节码文件未更新,重新编译/重新运行程序、刷新,Build-->Rebuild-->Reload

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_jvm_20

3)阿里arthas(阿尔萨斯)

  • Arthas是一款线上监控诊断产品,通过全局视角实时查看应用load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,大大提升线上问题排查效率
  • 官网:<https://arthas.aliyun.com/doc/>
  • dump 类的全限定名:dump已加载类的字节码文件到特定目录
  • jad 类的全限定名:反编译已加载类的源码

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_21

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_22

Arthas命令列表:详情可查看 https://arthas.aliyun.com/doc/commands.html

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_jvm_23

dashboard -i 2000 -n 3    #查看当前系统的实时数据面板,2s刷新一次、共刷新3次

dump java.lang.String
dump -d D:\practise com.gk.GkApiApplication  #将JVM中实际运行的 class 的 byte code dump 到指定目录

jad com.gk.GkApiApplication   #反编译指定已加载类的源码

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_24

在IDEA@GetMapp("/{id}")中,点击左侧小气球——>选择Generate request in HTTP Client,可模拟请求

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_25

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_jvm_26

案例:使用阿里arthas定位线上出现的字节码问题

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_操作数_27

具体步骤:

  • 将arthas放到服务器。arthas-boot.jar上传到服务器,java -jar arthas-boot.jar启动arthas
  • 反编译指定已加载类的源码:\\jad 包名.类名,例如jad com.gk.GkApiApplication\`

1.4 总结

1)如何查看字节码文件

  • 本地文件可以使用jclasslib工具查看,开发环境使用jclasslib插件
  • 服务器上文件使用javap命令直接查看,也可以通过arthas的dump命令导出字节码文件再查看本地文件。还可以使用jad命令反编译出源代码

2)字节码文件的核心组成有哪些

Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解_字节码_28

二、Java注解

2.1 什么是Java注解

  • Java注解(Annotation)又称Java标注,是JDK5.0引入的一种注释机制
  • Java语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注
public class PersonServiceTest {
    @Test     //注解(Annotation)
    public void testLogin() {
        
    }
    
    @Test    //注解(Annotation)
    public void testRegister() {
        
    }
}

注解作用:

  • 对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定。例如JUnit框架中。标记了注解@Test的方法就可以被当成测试方法执行,没有标记的就不能当成测试方法执行
  • 注解是给编译器或JVM(Java虚拟机)看的,编译器或JVM(Java虚拟机)可以根据注解来完成对应的功能

2.2 注释和注解Annotation的区别(掌握)

  • 共同点:都可以对程序进行解释说明。
  • 不同点:注释,是给程序员看的。只在Java中有效。在class文件中不存在注释的。当编译之后,会进行注释擦除。

注解,是给虚拟机看的。当虚拟机看到注解之后,就知道要做什么事情了。

2.3 如何使用注解(掌握)

在以前看过注解@Override。

  • 当子类重写父类方法的时候,在重写的方法上面写@Override。
  • 当虚拟机看到@Override的时候,就知道下面的方法是重写的父类的。检查语法,如果语法正确编译正常,如果语法错误,就会报错。

2.4 Java中已经存在的注解(掌握)

  • @Override:表示方法的重写
  • @Deprecated:表示修饰的方法已过时
  • @SuppressWarnings("all"):压制警告

除此之外,还需要掌握第三方框架中提供的注解:

比如:Junit

  • @Test 表示运行测试方法
  • @Before 表示在Test之前运行,进行数据的初始化
  • @After 表示在Test之后运行,进行数据的还原

2.5 自定义注解(了解)

  • 自定义注解单独存在是没有什么意义的,一般会跟反射结合起来使用,会用发射去解析注解。
//自定义注解--格式。默认值可以不用写
public @interface 注解名称 {
    public 属性类型 属性名() default 默认值;   //属性类型:Java支持的数据类型 基本上都支持
}

//自定义注解和使用
@注解名(属性名1=值1,属性名2=值2)
  • 针对于注解,只要掌握会使用别人已经写好的注解即可。
  • 关于注解的解析,一般是在框架的底层已经写好了。
  • 注解名跟类名的命名规则一样,首字母大写,如果有多个单词,每个单词的首字母大写。

示例:

/**
   自定义注解(默认值可以不用写)
 */
public @interface MyAnnoTest1 {
    public String name();
    public int age();
}
@MyAnnoTest1(name = "wj" , age = 18)
public class MyAnnoDemo1 {
    @MyAnnoTest1(name = "wj", age = 18)
    String aaa;
    String bbb;
 
    @MyAnnoTest1(name = "wj" , age = 18)
    public void method1(){
        System.out.println("method1方法");
    }
 
    public void method2(){
        System.out.println("method2方法");
    }
}

2.6 注解小结

掌握如何使用已经存在的注解即可。

  • @Override:表示方法的重写
  • @Deprecated:表示修饰的方法已过时
  • @SuppressWarnings("all"):压制警告
  • @Test:表示要运行的方法

在以后的实际开发中,注解是使用框架已经提供好的注解。

自定义注解+解析注解(很难的,了解),一般会出现在框架的底层。当以后我们要自己写一个框架的时候,才会用到自定义注解+解析注解。

参考黑马程序员相关视频及文档

标签:文件,插件,Java,字节,jclasslib,操作数,注解,public
From: https://blog.51cto.com/u_14971476/11920771

相关文章

  • java基础知识-JVM知识详解
    一、JVM内存结构Java虚拟机(JVM)的内存结构主要分为几个不同的区域,每个区域都有其特定的目的和功能。以下是JVM内存结构的主要组成部分:先看一下总体的结构图程序计数器(ProgramCounterRegister)这是一个较小的内存块,用于存储当前线程所执行的字节码指令的地址。每......
  • Java毕业设计 基于Springboot+Vue的城市公交查询系统
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍近年来,科技飞速发展,在经济全球化的背景之下,互联网技术将进一步提高社会综合发展的效率和速度,互联网技术也会涉及到各个领域,而城市公交查询系统在网络背景下有着无法忽视的作用......
  • Java毕业设计 基于Springboot+Vue的设计企业公司官网网站系统
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍在当前的数字化时代背景下,企业公司官网网站系统的设计与开发显得尤为重要。随着互联网的普及和技术的不断进步,企业官网已不仅是展示企业形象和产品信息的窗口,更是企业与客户、合作......
  • Java毕业设计 基于Springboot+Vue的文献搜索系统
    文末获取资源,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍文献搜索系统采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的java进行编写,使用了springboot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括:......
  • 【保姆级VSCode 插件开发之实现语音转文字其一】
    保姆级VSCode插件开发第一章VSCode插件开发入门之语音转文字记录文章目录保姆级VSCode插件开发前言一、创建新笔记文件1.生成新项目框架2.创建新笔记文件3.`package.json`注册命令4.效果展示总结前言本篇文章主要介绍开发一个VSCode插件实现语音转文字记......
  • 计算机毕业设计 二手闲置交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解
    ......
  • 【Java】ApiPost请求返回 `406` 状态码(jackson)
    Java系列文章目录补充内容Windows通过SSH连接Linux第一章Linux基本命令的学习与Linux历史文章目录Java系列文章目录一、前言二、学习内容:三、问题描述3.1问题截图3.2错误简介3.2.1HTTP状态码`406NotAcceptable`3.2.2序列化和反序列化3.3后端问题位置四......
  • 计算机毕业设计:Java旅游景区订票售票系统开题报告+源代码效果图
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • 一文教你学会java代码审计
    《网安面试指南》http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484339&idx=1&sn=356300f169de74e7a778b04bfbbbd0ab&chksm=c0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene=21#wechat_redirect《Java代码审计》htt......
  • 这个桌面插件真的酷!该有的都有了!改造桌面必备神器
    这个桌面插件真的酷!该有的都有了!改造桌面必备神器。一个好用的桌面插件可以给我们提供很多的方便,给自己桌面打扮一下,定制一个自己喜欢的桌面插件,让桌面变得更美观实用!如何给桌面添加一个实用的插件?跟着小编一起来看下:首先,可以通过互联网找到“芝麻桌面美化”,然后下载安装......