(Ljava/lang/String;)V解释
在开发中有时会看到类似(Ljava/lang/String;)V的错误信息或提示信息,例如:
java.lang.NoSuchMethodError: com.test.HelloWorld.greeting(Ljava/lang/String;)V
其中(Ljava/lang/String;)V是用描述符表示的。
一、class文件描述符
描述符是表示字段或方法类型的字符串,其中Java类的方法、字段、局部变量和形参的名称作为非限定名称(unqualified names)存储。一个非限定名称必须至少包含一个Unicode字符,且不能包含任何ASCII字符.
、;
、[
或/
。例如:Thread类的普通二进制名称是java.lang.Thread
,在class文件格式的内部描述符形式中对应的是 java/lang/Thread
。
1、字段描述符
字段描述符表示类、实例或局部变量的类型。字段类型(FieldType)主要有三种:
-
基本类型(BaseType)
B C D F I J S Z
(每种分别表示一种基本类型) -
对象类型(ObjectType)
L ClassName ;
-
数组类型(ArrayType)
[ ComponentType
ComponentType表示组件类型,它可能是任一一种字段类型。
字段描述符的具体解释如下:
字段类型术语 | 类型 | 解释 |
---|---|---|
B | btye | 有符号字节 |
C | char | 使用UTF-16编码的Unicode字符 |
D | double | 双精度浮点值 |
F | float | 单精度浮点值 |
I | int | 整数 |
J | long | 长整数 |
L ClassName ; | reference | ClassName类的一个实例 |
S | short | 有符号短整数 |
Z | boolean | true或false |
[ | reference | 一维数组 |
-
举例
类型为int的实例变量的字段描述符是:
I
;类型为Object的实例变量的字段描述符是:
Ljava/lang/Object;
;多维数组类型
double[][][]
的实例变量的字段描述符是:[[[D
。
2、方法说明
方法描述符包含零个或多个参数描述符和一个返回描述符;参数描述符表示方法接受的参数类型,返回描述符表示方法返回值的类型。
方法描述符格式如下:
( {参数描述符} )
-
参数描述符(ParameterDescriptor)
任一字段描述符。
-
返回描述符(ReturnDescriptor)
任一字段描述符或空描述符(VoidDescriptor):
V
。 -
举例:
方法Object m(int i, double d, Thread t) {...}
的描述符为:
(IDLjava/lang/Thread;)Ljava/lang/Object;
二、JBE
JBE(Java Bytecode Editor)是一个字节码编辑器,可以查看和修改Java class文件。
如下为Java代码和用JBE看到的class文件内容:
- Java文件
package com.test;
public class HelloWorld {
public void greeting(String name){
System.out.println("Hello " + name);
}
}
- class文件
参考资料:
Chapter 4. The class File Format
Chapter 3: JNI Types and Data Structures