Jvm之用C#解析class文件
  yqdtHKhvd9Ja 2023年11月12日 30 0


项目地址

GitHub - lxw112190/JavaClassReader: C# JavaClassReader

项目结构

Jvm之用C#解析class文件_ico

一个简单的测试类

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");
    }
}

效果

Jvm之用C#解析class文件_开发语言_02

 详细信息

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)

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  6554CEvzIu1g   2023年11月12日   35   0   0 SystemText数据
  4ozAyWrX6Sw9   2023年11月12日   27   0   0 javajar
yqdtHKhvd9Ja