为什么“L”被添加到我的 Java 路径中?

2022-09-02 20:12:07

我在我的类路径中加载了一个jar(如果重要的话,在iReport中),我确定它有所需的方法,但是当我尝试测试连接时,因此调用jar,我得到一个java.lang.NoSuchMethodError,说它引用了类

Lorg/springframework/web/context/WebApplicationContext

我不确定这是否与问题有关,但是开头的“L”从何而来?还有一次,我引用一个类,在类后有一个“V”。这些信件来自哪里,它们是什么意思?

堆栈跟踪的开始:

java.lang.NoSuchMethodError:  
org.springframework.web.context.ContextLoader
.getCurrentWebApplicationContext()Lorg/springframework/web/context/WebApplicationContext;

答案 1

Java 使用这些字母在内部对方法签名进行编码。例如,“L”宣布后面的“Object”,它由其完整的类名指定,后跟分号。“V”前面应该加上括号,并描述返回类型的“void”。

以你为例:

java.lang.NoSuchMethodError:
org.springframework.web.context.ContextLoader .getCurrentWebApplicationContext()Lorg/springframework/web/context/WebApplicationContext;

它说,在调用的类中没有一个方法不接受任何参数[由]表示,并返回一个名为'org/springframework/web/context/WebApplicationContext(由';'关闭)的对象(由)宣布。org.springframework.web.context.ContextLoadergetCurrentWebApplicationContext()L

编辑:所有代码的列表位于 JNI 规范的表 3.2 中。

编辑2:更权威:JVM 规范的第 4.3 节描述符包含格式和代码的完整引用。


答案 2

该字符用于表示 Java 内部类规范中的类名。L

有关详细信息,请参阅 Java VM 规范

字段类型的

BaseType
B     byte (signed byte)
C     char (Unicode character)
D     double (double-precision floating-point value)
F     float (single-precision floating-point value)
I     int (integer)
J     long (long integer)
L<classname>;     reference (an instance of class <classname>)
S     short (signed short)
Z     boolean (true or false)
[     reference (one array dimension )

推荐