项目地址

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文件的更多相关文章

  1. JVM(五)手动解析.class文件

    一:不同进制之间的转换 二进制:逢2进1,数字0-1. 八进制:逢8进1,数字0-7.三位二进制表示一位八进制.三位二进制最大为111,最大为7. 十进制:逢10进1,数字0-9.四位二进制表示一位十 ...

  2. 解析xml文件的四种方式

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  3. JVM详解之:java class文件的密码本

    目录 简介 一个简单的class ClassFile的二进制文件 class文件的密码本 magic version 常量池 描述符 access_flags this_class和super_cla ...

  4. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  5. CSharpGL(9)解析OBJ文件并用CSharpGL渲染

    CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...

  6. Jsoup系列学习(2)-解析html文件

    解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...

  7. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  8. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  9. CSharpGL(5)解析3DS文件并用CSharpGL渲染

    CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...

  10. php解析.csv文件

    public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_F ...

随机推荐

  1. Javascript中的var变量声明作用域问题

    先看一下这两段代码的执行结果 var name2 = 'What!'; function a() { if (typeof name2 === 'undefined') { console.log(' ...

  2. 【Unity3D】固定管线着色器一

    1 前言 ​ 着色器(Shader)是渲染管线中最重要的一环,Unity3D 底层基于 OpenGL 实现,读者可以通过 渲染管线 了解 Unity3D 渲染流程. ​ OpenGL 1.x 为固定管 ...

  3. 【Android】截图案例

    1 工作空间 2 代码 ​ MainActivity.java package com.zhyan8.demo; import android.graphics.Bitmap; import andr ...

  4. ORA-12514问题解决

    版本:11.2.0.1.0 - 64bit 本机安装Oracle后链接测试发现以下情况: sqlplus scott/tiger 正常登陆 sqlplus scott/tiger@orcl  登陆失败 ...

  5. postgresql常见开发技巧

    1.数据类型 名字 描述 bigint 有符号 8 字节整数 bigserial 自增八字节整数 bit [ (n) ] 定长位串 bit varying [ (n) ] 变长位串 boolean 逻 ...

  6. ckeditor使用技巧总结

    介绍 官方开发者文档:CKEditor 4 documentation 技巧总结 1.挑选需要的插件,打包下载 参考:CKEditor 4.4.1 添加代码高亮显示插件功能--使用官方推荐Code S ...

  7. 华为OD请己经入职的人出来谈谈你的真实感受?

    修改了一下回答的排版,之前只要更新就在最前面, 现在按照会见顺序重新整理了一下. 部门捞人 上海 深圳 西安 东莞 办公地 武汉南京现在也有 通道:点击通道2字 写在前面 总结一下我的体验其实挺好的, ...

  8. MinGW 和 MSVC

    在 Winodws 上编译通常会用到这两种工具链 MinGW(Minimalist GNU for Windows) 通常用于跨平台开发,可以编译出在 Windows 系统上运行的 .exe 程序 M ...

  9. C++ 多线程的错误和如何避免(5)

    要记得对加锁的临界区解锁 前提:在多个线程共享一块资源或者数据时,我们需要加上互斥锁来保护临界区(否则出现数据未定义的行为) 问题:我们往往在写了很多代码之后忘记 unlock 互斥锁,那么等待该资源 ...

  10. win32 - Session 0 隔离

    在Windows XP,Windows Server 2003和Windows操作系统的早期版本中,所有服务都与登录控制台的第一个用户在同一会话中运行.该会话称为会话0.在会话0中一起运行服务和用户应 ...