[解決済み] [L配列表記 - その由来は?
質問
というメッセージはよく見かけますが
[L
を使っているメッセージをよく見かけますが、これは配列を表す型です。
[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
(上記は私が勝手に引いた例です。) これが配列を意味することはわかりますが、この構文はどこから来ているのでしょうか?なぜ、冒頭の
[
と書いてあるのに、閉じ角括弧がないのはなぜか?また、なぜLなのでしょうか?純粋に恣意的なのか、それとも何か他の歴史的/技術的な理由があるのでしょうか?
どのように解決するのですか?
[
はArrayを表し
Lsome.type.Here
は型を意味します。これは型記述子が使われるのと似ている
バイトコードで内部的に使われる
で見られる
Java仮想マシン仕様の§4.3
-- にあります。
なるべく簡潔に
. 唯一の違いは
リアル
ディスクリプタは
/
よりも
.
ではなく、パッケージを表すために
例えば、プリミティブの場合、その値は
[I
intの配列の場合、2次元の配列は次のようになります。
[[I
.
クラスは任意の名前を持つことができるので、それがどのクラスであるかを識別することが難しくなります。
L
で終わる場合、クラス名は
;
ディスクリプタは、フィールドやメソッドの種類を表すためにも使われます。
例えば
(IDLjava/lang/Thread;)Ljava/lang/Object;
... はメソッドに対応し、そのパラメータは
int
,
double
そして
Thread
で、戻り値の型は
Object
編集
java dissambler を使って、.class ファイルで見ることもできます。
C:>more > S.java
class S {
Object hello(int i, double d, long j, Thread t ) {
return new Object();
}
}
^C
C:>javac S.java
C:>javap -verbose S
class S extends java.lang.Object
SourceFile: "S.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #2.#12; // java/lang/Object."<init>":()V
const #2 = class #13; // java/lang/Object
const #3 = class #14; // S
const #4 = Asciz <init>;
const #5 = Asciz ()V;
const #6 = Asciz Code;
const #7 = Asciz LineNumberTable;
const #8 = Asciz hello;
const #9 = Asciz (IDJLjava/lang/Thread;)Ljava/lang/Object;;
const #10 = Asciz SourceFile;
const #11 = Asciz S.java;
const #12 = NameAndType #4:#5;// "<init>":()V
const #13 = Asciz java/lang/Object;
const #14 = Asciz S;
{
S();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
java.lang.Object hello(int, double, long, java.lang.Thread);
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 3: 0
}
そして、生のクラスファイル(5行目を見てください)。
関連
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
セミコロン期待値エラー解決
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
プロジェクトの依存関係を解決できない。
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
無効なメソッド宣言
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
[解決済み] なんだこれ。[Ljava.lang.Object;?