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 ...
随机推荐
- Shadow DOM的理解
Shadow DOM的理解 Shadow DOM是HTML的一个规范,其允许在文档document渲染时插入一颗DOM元素子树,但是这棵子树不在主DOM树中,Shadow DOM如果按照英文翻译的话可 ...
- pico命令
pico命令 pico是一个简单易用.以显示导向为主的文字编辑程序,具有pine电子邮件编写器的风格.在现代Linux系统上,nano即pico的GNU版本是默认安装的,在使用上和pico一模一样. ...
- powerdesigner导出模型为RTF
在设计模型的时候需要将设计好的模型进行尺寸调整并复制到word中.这时候就需要利用导出报告功能,导出为word格式. 再做进一步处理. 1.选择[报告]-[Generate Report] 2.自动打 ...
- win32 - Screen to bmp file(BYTE)
void WINAPI CaptureScreenIntoFile() { BITMAPFILEHEADER bfHeader; BITMAPINFOHEADER biHeader; HGDIOBJ ...
- LibModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板
前言 本文章讲解libmodbus. libModbus介绍 libmodbus是一个免费软件库,可根据Modbus协议发送/接收数据.该库用C编写,并支持RTU(串行)和TCP(以太网) ...
- sql题目---day39
# 1.查询所有的课程的名称以及对应的任课老师姓名 #where select teacher.tname,course.cname from teacher,course where course. ...
- 【WiFi开发全攻略】WIFI基础知识大全
[WiFi开发全攻略]WIFI基础知识大全 1. Wi-Fi起源 现在我们大家对Wi-Fi肯定都不陌生,无论是笔记本,手机,智能电视,都离不开Wi-Fi.目前我们一般用的都是Wi-Fi5,Wi-Fi6 ...
- FPGA MCS文件为什么比BIN文件烧录快
原因 Xilinx FPGA固化FPGA程序到FLASH时,可以选择使用MCS或者BIN格式,BIN是纯二进制文件,MCS是ASCII格式的文本文件. MCS是Intel早期为MCS系列 II ISI ...
- 用 NetworkX + Gephi + Nebula Graph 分析<权力的游戏>人物关系(下篇)
在上一篇[1]中,我们通过 NetworkX 和 Gephi 展示了<权力的游戏>中的人物关系.在本篇中,我们将展示如何通过 NetworkX 访问图数据库 Nebula Graph. N ...
- Java 设计模式----单例模式--饿汉式
1 package com.bytezreo.singleton; 2 3 /** 4 * 5 * @Description 单例设计模式 例子-----饿汉式 6 * @author Bytezer ...