Jvm之用C#解析class文件
项目地址
GitHub - lxw112190/JavaClassReader: C# JavaClassReader
项目结构

一个简单的测试类
public class Test {
Integer code = 123;
String name = "lxw";
void method1() {
System.out.println("我是method1");
}
int method2(int i) {
System.out.println("我是method2");
return 1;
}
long method3(int i,Class test) {
System.out.println("我是method3");
return 1;
}
String method4(int i,long l,String s) {
System.out.println("我是method4");
return "lxw";
}
void method5(int[] i,byte[] b) {
System.out.println("我是method5");
}
public static void main(String[] args) {
System.out.println("我是main");
}
}
效果

详细信息
ConstantPool:79
#14 class Test
#15 class java/lang/Object
#16 UTF-8 code
#17 UTF-8 Ljava/lang/Integer;
#18 UTF-8 name
#19 UTF-8 Ljava/lang/String;
#20 UTF-8 <init>
#21 UTF-8 ()V
#22 UTF-8 Code
#23 UTF-8 LineNumberTable
#24 UTF-8 LocalVariableTable
#25 UTF-8 this
#26 UTF-8 LTest;
#27 UTF-8 method1
#28 UTF-8 method2
#29 UTF-8 (I)I
#30 UTF-8 i
#31 UTF-8 I
#32 UTF-8 method3
#33 UTF-8 (ILjava/lang/Class;)J
#34 UTF-8 test
#35 UTF-8 Ljava/lang/Class;
#36 UTF-8 method4
#37 UTF-8 (IJLjava/lang/String;)Ljava/lang/String;
#38 UTF-8 l
#39 UTF-8 J
#40 UTF-8 s
#41 UTF-8 method5
#42 UTF-8 ([I[B)V
#43 UTF-8 [I
#44 UTF-8 b
#45 UTF-8 [B
#46 UTF-8 main
#47 UTF-8 ([Ljava/lang/String;)V
#48 UTF-8 args
#49 UTF-8 [Ljava/lang/String;
#50 UTF-8 SourceFile
#51 UTF-8 Test.java
#52 NameAndType <init>
#53 class java/lang/Integer
#54 NameAndType valueOf
#55 NameAndType code
#56 UTF-8 lxw
#57 NameAndType name
#58 class java/lang/System
#59 NameAndType out
#60 UTF-8 我是method1
#61 class java/io/PrintStream
#62 NameAndType println
#63 UTF-8 我是method2
#64 UTF-8 我是method3
#65 UTF-8 我是method4
#66 UTF-8 我是method5
#67 UTF-8 我是main
#68 UTF-8 Test
#69 UTF-8 java/lang/Object
#70 UTF-8 java/lang/Integer
#71 UTF-8 valueOf
#72 UTF-8 (I)Ljava/lang/Integer;
#73 UTF-8 java/lang/System
#74 UTF-8 out
#75 UTF-8 Ljava/io/PrintStream;
#76 UTF-8 java/io/PrintStream
#77 UTF-8 println
#78 UTF-8 (Ljava/lang/String;)V
classname:Test
superclass:java/lang/Object
field:code, desc:Ljava/lang/Integer;
field:name, desc:Ljava/lang/String;
method:<init>(), desc:()V
aload_0
invokespecial
nop
aconst_null
aload_0
bipush
lshr
invokestatic
nop
iconst_m1
putfield
nop
iconst_0
aload_0
ldc
iconst_1
putfield
nop
iconst_2
return
method:method1(), desc:()V
getstatic
nop
iconst_3
ldc
iconst_4
invokevirtual
nop
iconst_5
return
method:method2(), desc:(I)I
getstatic
nop
iconst_3
ldc
lconst_0
invokevirtual
nop
iconst_5
iconst_1
ireturn
method:method3(), desc:(ILjava/lang/Class;)J
getstatic
nop
iconst_3
ldc
lconst_1
invokevirtual
nop
iconst_5
lconst_1
lreturn
method:method4(), desc:(IJLjava/lang/String;)Ljava/lang/String;
getstatic
nop
iconst_3
ldc
fconst_0
invokevirtual
nop
iconst_5
ldc
iconst_1
areturn
method:method5(), desc:([I[B)V
getstatic
nop
iconst_3
ldc
fconst_1
invokevirtual
nop
iconst_5
return
method:main(), desc:([Ljava/lang/String;)V
getstatic
nop
iconst_3
ldc
fconst_2
invokevirtual
nop
iconst_5
return
([Ljava/lang/String;)V的含义
“([Ljava/lang/String;)V” 是一种对函数返回值和参数的编码。这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。一个数组int[],就需要表示为这样"[I"。如果多个数组double[][][]就需要表示为这样 "[[[D"。也就是说每一个方括号开始,就表示一个数组维数。多个方框后面,就是数组 的类型。
如果以一个L开头的描述符,就是类描述符,它后紧跟着类的字符串,然后分号“;”结束。
比如"Ljava/lang/String;"就是表示类型String;
"[I"就是表示int[];
"[Ljava/lang/Object;"就是表示Object[]。
JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:
(参数描述符)返回类型
当一个函数不需要返回参数类型时,就使用”V”来表示。
比如"()Ljava/lang/String;"就是表示String f();
"(ILjava/lang/Class;)J"就是表示long f(int i, Class c);
"([B)V"就是表示void String(byte[] bytes);
|
Java 类型 |
符号 |
|
Boolean |
Z |
|
Byte |
B |
|
Char |
C |
|
Short |
S |
|
Int |
I |
|
Long |
J |
|
Float |
F |
|
Double |
D |
|
Void |
V |
|
objects对象 |
以"L"开头,以";"结尾,中间是用"/" 隔开的包及类名。比如:Ljava/lang/String;如果是嵌套类,则用$来表示嵌套。例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z" |
另外数组类型的简写,则用"["加上如表A所示的对应类型的简写形式进行表示就可以了,
比如:[I 表示 int [];[L/java/lang/objects;表示Objects[],另外。引用类型(除基本类型的数组外)的标示最后都有个";"
例如:
"()V" 就表示void Func();
"(II)V" 表示 void Func(int, int);
"(Ljava/lang/String;Ljava/lang/String;)I".表示 int Func(String,String)
Jvm之用C#解析class文件的更多相关文章
- JVM(五)手动解析.class文件
一:不同进制之间的转换 二进制:逢2进1,数字0-1. 八进制:逢8进1,数字0-7.三位二进制表示一位八进制.三位二进制最大为111,最大为7. 十进制:逢10进1,数字0-9.四位二进制表示一位十 ...
- 解析xml文件的四种方式
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...
- JVM详解之:java class文件的密码本
目录 简介 一个简单的class ClassFile的二进制文件 class文件的密码本 magic version 常量池 描述符 access_flags this_class和super_cla ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- CSharpGL(9)解析OBJ文件并用CSharpGL渲染
CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...
- Jsoup系列学习(2)-解析html文件
解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- CSharpGL(5)解析3DS文件并用CSharpGL渲染
CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...
- php解析.csv文件
public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_F ...
随机推荐
- Linux中$home和波浪号~
在Linux中当前用户的主目录可以有三种表示方法,都是等效的[正常不改配置情况下]例如用户名为sy,进入当前用户的主目录/home/sy 输入cd ~ 或输入cd $HOME 或输入cd /home/ ...
- 旁门左道:借助 HttpClientHandler 拦截请求,体验 Semantic Kernel 插件
前天尝试通过 one-api + dashscope(阿里云灵积) + qwen(通义千问)运行 Semantic Kernel 插件(Plugin) ,结果尝试失败,详见前天的博文. 今天换一种方式 ...
- 用ELK分析每天4亿多条腾讯云MySQL审计日志(4)--MySQL全文索引
前言: 该文章将会介绍以下: 1,MySQL全文索引的使用 2,全文索引停止词STOPWORD 3,使用全文索引的高效和准确 最近事情比较少,刚好可以梳理一下以前的工作,做一下总结! 在 ...
- Vue实现简单计算器功能
知识点: v-model双向绑定 v-on事件绑定 实现效果 源码 <!DOCTYPE html> <html lang="en"> <head> ...
- form表单如何实现ajax提交
最近在开发一个游戏网关的后台管理系统,总结了下中间碰到的一些问题. 之一就是:form表单如何实现ajax提交? 问题:在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转, ...
- 掌握云容器网络:何为ipvs
本文分享自华为云社区<[理解云容器网络]2-基础篇-ipvs介绍>,作者: 可以交个朋友. IPVS简介 ipvs是工作在Linux内核态的4层负载均衡:和用户态的负载均衡软件(如ngin ...
- portainer docker可视化工具
下载可视化工具 docker pull portainer/portainer 启动portainer --restart=always 只要挂掉了 就自动重启 docker run -d -p 80 ...
- win终端利器-Cmder的安装使用
cmder 官网:https://cmder.app/ 安装 直接选择full版本下载,完成后解压即可 启动 直接双击Cmder.exe 如果每次都进入到 Cmder 解压目录双击 Cmder.exe ...
- 【生成对抗网络学习 其二】GAN(keras实现)代码阅读笔记
想来想去还是记录一下吧,主要是怕以后时间长忘了 好记性不如烂笔头 代码来自eriklindernoren的开源GAN实现:https://github.com/eriklindernoren/Kera ...
- 【Azure K8S】记录AKS VMSS实例日志收集方式
问题描述 如何从AKS的VMSS集群中收集实例日志? 参考步骤 第一步:登陆VMSS实例 参考官网步骤:使用 SSH 连接到 Azure Kubernetes 服务 (AKS) 群集节点以进行维护或故 ...