在开发中有时会看到类似(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

What Is a Java Compiler?

JBE - Java Bytecode Editor

Difference between byte code .<init>()V vs .<init>(Z)V

what is Ljava.lang.String;@

JNI字段描述符 ([Ljava/lang/String;)V