项目地址

GitHub - lxw112190/JavaClassReader: C# JavaClassReader

项目结构

一个简单的测试类

  1. public class Test {
  2. Integer code = 123;
  3. String name = "lxw";
  4. void method1() {
  5. System.out.println("我是method1");
  6. }
  7. int method2(int i) {
  8. System.out.println("我是method2");
  9. return 1;
  10. }
  11. long method3(int i,Class test) {
  12. System.out.println("我是method3");
  13. return 1;
  14. }
  15. String method4(int i,long l,String s) {
  16. System.out.println("我是method4");
  17. return "lxw";
  18. }
  19. void method5(int[] i,byte[] b) {
  20. System.out.println("我是method5");
  21. }
  22. public static void main(String[] args) {
  23. System.out.println("我是main");
  24. }
  25. }

效果

详细信息

  1. ConstantPool:79
  2. #14 class Test
  3. #15 class java/lang/Object
  4. #16 UTF-8 code
  5. #17 UTF-8 Ljava/lang/Integer;
  6. #18 UTF-8 name
  7. #19 UTF-8 Ljava/lang/String;
  8. #20 UTF-8 <init>
  9. #21 UTF-8 ()V
  10. #22 UTF-8 Code
  11. #23 UTF-8 LineNumberTable
  12. #24 UTF-8 LocalVariableTable
  13. #25 UTF-8 this
  14. #26 UTF-8 LTest;
  15. #27 UTF-8 method1
  16. #28 UTF-8 method2
  17. #29 UTF-8 (I)I
  18. #30 UTF-8 i
  19. #31 UTF-8 I
  20. #32 UTF-8 method3
  21. #33 UTF-8 (ILjava/lang/Class;)J
  22. #34 UTF-8 test
  23. #35 UTF-8 Ljava/lang/Class;
  24. #36 UTF-8 method4
  25. #37 UTF-8 (IJLjava/lang/String;)Ljava/lang/String;
  26. #38 UTF-8 l
  27. #39 UTF-8 J
  28. #40 UTF-8 s
  29. #41 UTF-8 method5
  30. #42 UTF-8 ([I[B)V
  31. #43 UTF-8 [I
  32. #44 UTF-8 b
  33. #45 UTF-8 [B
  34. #46 UTF-8 main
  35. #47 UTF-8 ([Ljava/lang/String;)V
  36. #48 UTF-8 args
  37. #49 UTF-8 [Ljava/lang/String;
  38. #50 UTF-8 SourceFile
  39. #51 UTF-8 Test.java
  40. #52 NameAndType <init>
  41. #53 class java/lang/Integer
  42. #54 NameAndType valueOf
  43. #55 NameAndType code
  44. #56 UTF-8 lxw
  45. #57 NameAndType name
  46. #58 class java/lang/System
  47. #59 NameAndType out
  48. #60 UTF-8 我是method1
  49. #61 class java/io/PrintStream
  50. #62 NameAndType println
  51. #63 UTF-8 我是method2
  52. #64 UTF-8 我是method3
  53. #65 UTF-8 我是method4
  54. #66 UTF-8 我是method5
  55. #67 UTF-8 我是main
  56. #68 UTF-8 Test
  57. #69 UTF-8 java/lang/Object
  58. #70 UTF-8 java/lang/Integer
  59. #71 UTF-8 valueOf
  60. #72 UTF-8 (I)Ljava/lang/Integer;
  61. #73 UTF-8 java/lang/System
  62. #74 UTF-8 out
  63. #75 UTF-8 Ljava/io/PrintStream;
  64. #76 UTF-8 java/io/PrintStream
  65. #77 UTF-8 println
  66. #78 UTF-8 (Ljava/lang/String;)V
  67. classname:Test
  68. superclass:java/lang/Object
  69. field:code, desc:Ljava/lang/Integer;
  70. field:name, desc:Ljava/lang/String;
  71. method:<init>(), desc:()V
  72. aload_0
  73. invokespecial
  74. nop
  75. aconst_null
  76. aload_0
  77. bipush
  78. lshr
  79. invokestatic
  80. nop
  81. iconst_m1
  82. putfield
  83. nop
  84. iconst_0
  85. aload_0
  86. ldc
  87. iconst_1
  88. putfield
  89. nop
  90. iconst_2
  91. return
  92. method:method1(), desc:()V
  93. getstatic
  94. nop
  95. iconst_3
  96. ldc
  97. iconst_4
  98. invokevirtual
  99. nop
  100. iconst_5
  101. return
  102. method:method2(), desc:(I)I
  103. getstatic
  104. nop
  105. iconst_3
  106. ldc
  107. lconst_0
  108. invokevirtual
  109. nop
  110. iconst_5
  111. iconst_1
  112. ireturn
  113. method:method3(), desc:(ILjava/lang/Class;)J
  114. getstatic
  115. nop
  116. iconst_3
  117. ldc
  118. lconst_1
  119. invokevirtual
  120. nop
  121. iconst_5
  122. lconst_1
  123. lreturn
  124. method:method4(), desc:(IJLjava/lang/String;)Ljava/lang/String;
  125. getstatic
  126. nop
  127. iconst_3
  128. ldc
  129. fconst_0
  130. invokevirtual
  131. nop
  132. iconst_5
  133. ldc
  134. iconst_1
  135. areturn
  136. method:method5(), desc:([I[B)V
  137. getstatic
  138. nop
  139. iconst_3
  140. ldc
  141. fconst_1
  142. invokevirtual
  143. nop
  144. iconst_5
  145. return
  146. method:main(), desc:([Ljava/lang/String;)V
  147. getstatic
  148. nop
  149. iconst_3
  150. ldc
  151. fconst_2
  152. invokevirtual
  153. nop
  154. iconst_5
  155. 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. 【OpenGL ES】Blinn改进的冯氏光照模型

    1 前言 ​ 光照元素主要有环境光(ambient).漫反射光(diffuse).镜面反射光(specular),光照模型主要有冯氏模型和 Blinn 改进的冯氏模型,两者区别在与镜面反射光的计算,冯 ...

  2. go build gcc报错 /usr/bin/ld | cannot find -ldl cannot find -lpthread cannot find -lc

    之前一直在kali或者其他ubuntu设备编译sliver, 临时在centos7上编译时报错了 # github.com/bishopfox/sliver/server /usr/local/go/ ...

  3. 实操开源版全栈测试工具RunnerGo安装(二)Linux安装

    手动安装(支持Linux.MacOS.Windows) Linux安装步骤 以debian系统为例,其他linux系统参考官方文档:https://docs.docker.com/engine/ins ...

  4. 一个自定义可扩展的检测变量的函数typeofIt();

    自定义方法typeofIt()是用来判断传入的变量或属性是什么类型的; 1.如果是基础类型变量则返回代表基础变量类型小写格式的字符串及一些简易说明; 2.如果是对象类型变量则返回结尾带有"O ...

  5. deque双端队列

    # 支持从任意一端增加和删除元素 d = collections.deque() d.extend('abcdefg') d.append('h') d.extendleft(range(6)) # ...

  6. 异常处理之raise A from B

    raise A from B 语句用于连锁chain异常 from 后面的B可以是: - 异常类 - 异常实例 - None 如果B是异常类或者异常实例,那么B会被设置为A的__cause__属性,表 ...

  7. 苹果工程师对iOS线程开发的那点事津津乐道

    pthread,Thread总结 pthread: 通用的多线程API 使用方法 // 1. 创建线程: 定义一个pthread_t类型变量 pthread_t thread; // 2. 开启线程: ...

  8. 机器学习策略篇:详解满足和优化指标(Satisficing and optimizing metrics)

    满足和优化指标 要把顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,发现有时候设立满足和优化指标是很重要的,让我告诉是什么意思吧. 假设已经决定很看重猫分类器的分类准确度,这可以是\( ...

  9. Java 开发人员调度软件项目 (java基础编程总结项目)+javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理+构造器知识+重载+重写+接口+实现接口+关键字使用(static +equalsIgnoreCase+fianl+instanceof判断类型)+向下转型与向上转型

    /** * * @Description Java 开发人员调度软件项目 (java基础编程总结项目) * +javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理 * ...

  10. C++ //排序案列 //描述:将person自定义数据类型进行排序,Person中有属性 姓名,年龄,身高 //排序规则: 按照年龄进行的升序,如果年龄相同按照身高进行降序

    1 //排序案列 2 //描述:将person自定义数据类型进行排序,Person中有属性 姓名,年龄,身高 3 //排序规则: 按照年龄进行的升序,如果年龄相同按照身高进行降序 4 5 #inclu ...