ASM Java类的基本表述

2024-02-13 04:32
文章标签 java 基本 表述 asm

本文主要是介绍ASM Java类的基本表述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何使用ASM生成一个简单的JAVA类,里面使用到了很多的基本概念,比如:方法描述、引用描述等,下面将一一介绍。

一、类版本:

    一个Java二进制的类文件,都有一个版本,因此ASM中提供了几个常量来指定一个类的版,这些常量定义在org.objectweb.asm.Opcodes接口中,如下:

Java代码   收藏代码
  1. int V1_1 = 3 << 16 | 45;  
  2. int V1_2 = 0 << 16 | 46;  
  3. int V1_3 = 0 << 16 | 47;  
  4. int V1_4 = 0 << 16 | 48;  
  5. int V1_5 = 0 << 16 | 49;  
  6. int V1_6 = 0 << 16 | 50;  
  7. int V1_7 = 0 << 16 | 51;  

 二、内部名字:

     在Java二进制文件中使用的是JVM的内部名字,而不是我们所熟悉的以“.”分割的全限定名,内部名字是以“/”替代“.”的全名,例如:java.lang.String在JVM中的内部名字是java/lang/String。在ASM中可以使用org.objectweb.asm.Type类中的静态方法getInternalName(final Class c) 来获得,如下:

Java代码   收藏代码
  1. public class InternalNameTransform {  
  2.   
  3.     public static void main(String[] args) {  
  4.         System.out.println(Type.getInternalName(String.class));  
  5.         System.out.println(Type.getInternalName(Integer.class));  
  6.         System.out.println(Type.getInternalName(InternalNameTransform.class));  
  7.     }  
  8. }  

    运行结果:

Java代码   收藏代码
  1. java/lang/String  
  2. java/lang/Integer  
  3. org/victorzhzh/core/structure/InternalNameTransform  

三、类型描述:

    我们知道JAVA类型分为基本类型和引用类型,在JVM中对每一种类型都有与之相对应的类型描述,如下表:

Java类型JVM中的描述
booleanZ
charC
byteB
shortS
intI
floatF
longJ
doubleD
ObjectLjava/lang/Object;
int[I
Object[[Ljava/lang/Object;

    在ASM中要获得一个类的JVM内部描述,可以使用org.objectweb.asm.Type类中的getDescriptor(final Class c)方法,如下:

Java代码   收藏代码
  1. public class TypeDescriptors {  
  2.     public static void main(String[] args) {  
  3.         System.out.println(Type.getDescriptor(TypeDescriptors.class));  
  4.         System.out.println(Type.getDescriptor(String.class));  
  5.     }  
  6.   
  7. }  

    运行结果:

Java代码   收藏代码
  1. Lorg/victorzhzh/core/structure/TypeDescriptors;  
  2. Ljava/lang/String;  

 四、方法描述:

    在Java的二进制文件中,方法的方法名和方法的描述都是存储在Constant pool中的,且在两个不同的单元里。因此,方法描述中不含有方法名,只含有参数类型和返回类型,如下:

方法描述,在类中的方法描述,在二进制文件中的
void a(int i,float f)(IF)V
void a(Object o)(Ljava/lang/Object;)V
int a(int i,String s)(ILjava/lang/String;)I
int[] a(int[] i)([I)[I
String a()()Ljava/lang/String;

    获取一个方法的描述可以使用org.objectweb.asm.Type.getMethodDescriptor方法,如下:

Java代码   收藏代码
  1. public class MethodDescriptors {  
  2.     public static void main(String[] args) throws Exception {  
  3.         Method m = String.class.getMethod("substring"int.class);  
  4.         System.out.println(Type.getMethodDescriptor(m));  
  5.     }  
  6.   
  7. }  

    运行结果:

Java代码   收藏代码
  1. (I)Ljava/lang/String;  

 其实在org.objectweb.asm.Type类中提供了很多方法让我们去了解一个类,有兴趣的可以看一下它的源码,这对我们了解一个类和操作一个类还是有大帮助的。

这篇关于ASM Java类的基本表述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704485

相关文章

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化

Java 压缩包解压实现代码

《Java压缩包解压实现代码》Java标准库(JavaSE)提供了对ZIP格式的原生支持,通过java.util.zip包中的类来实现压缩和解压功能,本文将重点介绍如何使用Java来解压ZIP或RA... 目录一、解压压缩包1.zip解压代码实现:2.rar解压代码实现:3.调用解压方法:二、注意事项三、总

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

Spring AI 实现 STDIO和SSE MCP Server的过程详解

《SpringAI实现STDIO和SSEMCPServer的过程详解》STDIO方式是基于进程间通信,MCPClient和MCPServer运行在同一主机,主要用于本地集成、命令行工具等场景... 目录Spring AI 实现 STDIO和SSE MCP Server1.新建Spring Boot项目2.a

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

Spring Boot 集成 Solr 的详细示例

《SpringBoot集成Solr的详细示例》:本文主要介绍SpringBoot集成Solr的详细示例,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录环境准备添加依赖配置 Solr 连接定义实体类编写 Repository 接口创建 Service 与 Controller示例运行