你是不是经常看到控制台输出如题的日志,而似懂非懂的。
今天我们就来介绍下这些L啦究竟是些什么东东。
比如说我们经常看到这样的日志:
[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
先来简单的说一下, "["表示数组,后面跟着的是具体的类型。
这里我们再给出一个典型的例子来看看:
(IDLjava/lang/Thread;)Ljava/lang/Object;
这就是表示一个方法,方法有三个参数,类型分别为I,D,L。返回值类型为L。然后L类型要跟具体的类型,然后以"/"替换包名的".",L类型的要以“;”分号结尾。
使用javap查看
上代码,我们新建一个S类,然后通过javap就可以看到具体的类型了:
package com.importsource.datastructure;
class S {
Object hello(int i, double d, long j, Thread t ) {
return new Object();
}
}
执行命令javac S.java,然后执行javap -v S.class,得到如下输出:
Classfile /Users/hezhuofan/Documents/importsource_dev/concurrency-samples/src/main/java/com/importsource/datastructure/S.class Last modified May 28, 2018; size 305 bytes MD5 checksum bc36118f7847e5598c10ef406f539275 Compiled from "S.java" class com.importsource.datastructure.S minor version: 0 major version: 52 flags: ACC_SUPER Constant pool: #1 = Methodref #2.#12 // java/lang/Object."<init>":()V #2 = Class #13 // java/lang/Object #3 = Class #14 // com/importsource/datastructure/S #4 = Utf8 <init> #5 = Utf8 ()V #6 = Utf8 Code #7 = Utf8 LineNumberTable #8 = Utf8 hello #9 = Utf8 (IDJLjava/lang/Thread;)Ljava/lang/Object; #10 = Utf8 SourceFile #11 = Utf8 S.java #12 = NameAndType #4:#5 // "<init>":()V #13 = Utf8 java/lang/Object #14 = Utf8 com/importsource/datastructure/S { com.importsource.datastructure.S(); descriptor: ()V flags: Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 3: 0 java.lang.Object hello(int, double, long, java.lang.Thread); descriptor: (IDJLjava/lang/Thread;)Ljava/lang/Object; flags: Code: stack=2, locals=7, args_size=5 0: new #2 // class java/lang/Object 3: dup 4: invokespecial #1 // Method java/lang/Object."<init>":()V 7: areturn LineNumberTable: line 5: 0 } SourceFile: "S.java"
Field Type对应表
大多是基本类型的首字母大写,其中有几个比较特殊:J 、L和Z。这三个需要特别记忆一下:J表示long;L表示对象;Z表示boolean。