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 ...
随机推荐
- Python 中获取文件名
Python 获取文件名import osimport sys # ①获取当前文件名os.path.basename(__file__)# ②获取程序启动文件名os.path.basename(sys ...
- 【framework】TaskStack简介
1 前言 TaskStack 用于管理 app,一般一个应用程序对应一个 TaskStack,其父容器为 TaskStackContainers(DisplayContent 的子容器),子容器为 ...
- Oracle system identifier already exists specify another SID
问题说明 Centos7重装Oracle,使用DBCA重新创建实例test的时候报错,中文意思是: Oracle系统标识符(SID)"test"已存在,请指定另一个SID. 问题原 ...
- Layui项目实战干货总结(精品)
写代码时遇到的知识点拿出来分享. 1.layer弹出层显示在top顶层 // 监听工具条 table.on('tool(tb-book)', function (obj) { var data = o ...
- django学习第七天---创建多表结构,创建第三张表的三种方式,创建模型类时的一些元信息配置,多表增加
图书管理系统作业知识点整理 知识点1: print(request.POST.dict())#dict()方法能将QueryDict类型数据转换为普通字典类型数据 传数据时,可以用**{}打散的方式来 ...
- 【Azure Logic App】在Logic App中使用 Transfer XML组件遇见错误 undefined
问题描述 在Azure Logic App中,使用Transform XML组件进行XML内容的转换,但是最近这个组件运行始终失败. 问题解答 点击Transform XML组件上的错误案例,并不能查 ...
- 了解 Docker 网络
本章将会简单地讲述 Docker 中的网络,对于 CNM.Libnetwork 这些,限于笔者个人水平,将不会包含在内. Docker 的四种网络模式 Docker 有 bridge.none.hos ...
- 压测中TPS上不去的几种原因及分析?
1. 服务器资源限制:服务器的硬件资源(如 CPU.内存.磁盘)可能不足以处理大量的请求.在高负载情况下,服务器可能无法及时响应所有的请求,导致 TPS 上不去.解决方法可以考虑升级硬件资源或通过负载 ...
- Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架)
Prompt进阶系列1:LangGPT(从编程语言反思LLM的结构化可复用提示设计框架) 大语言模型 (Large Language Models, LLMs) 在不同领域都表现出了优异的性能.然而, ...
- C#条码识别的解决方案(ZBar)
简介 主流的识别库主要有ZXing.NET和ZBar,OpenCV 4.0后加入了QR码检测和解码功能.本文使用的是ZBar,同等条件下ZBar识别率更高,图片和部分代码参考在C#中使用ZBar识别条 ...