teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

追記

2017/10/05 02:38

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -30,12 +30,12 @@
30
30
 
31
31
  なので、次に示すjavaコード相当であることが見て取れます。
32
32
 
33
+ リスト1:
33
34
  ```java
34
35
  private EnumTest2(String name, int ordinal) {
35
36
  super(name, ordinal);
36
37
  }
37
38
  ```
38
-
39
39
  ---
40
40
 
41
41
  デコンパイル結果をjavaコードとして得たい場合、どこかからデコンパイルツールを見つけてくるとよいでしょう。自分はIntelliJ IDEAのplug-in(Fernflower decompiler)を使ってます。使っているといってもIDEAを介して暗黙的に利用しているに過ぎませんが・・・
@@ -44,4 +44,17 @@
44
44
  ---
45
45
  訂正:
46
46
  コンストラクターなのにメソッドの型voidを書いていたので訂正しました orz
47
- 失礼しました。
47
+ 失礼しました。
48
+
49
+ ---
50
+ 補足:
51
+ Fernflowerを使うとリスト2が得られ、jadを使うとリスト1が得られるとのこと。
52
+
53
+ リスト2:
54
+ ```java
55
+ private EnumTest2() {}
56
+ ```
57
+
58
+ よく考えてみるとこの点に気づけてなかったので補足します。
59
+
60
+ 質問者さんの期待は「どのようなbyte codeとなるかを素朴にjavaコードで表現したもの」つまりリスト1であったわけですが、enumの場合、実際にコンストラクターに渡される最初の2つの引数(名前と順序数)はコンパイラーが内部的に生成するものであり、java言語仕様上はこれらの引数は明示的に記述できませんしsuperを呼び出すこともできないという点はご存知かと思います。つまり純粋にjavaとしての正しいソースコードを得るという意味ではjadよりむしろFernflowerの方が正しいということなのだと思います。jadを使うとbyte codeの生成の仕組みをストレートに知ることができるという利点がありますが、これを使うなら「必ずしもjavaの正しいソースコードが得られるわけではない」点に注意しておくべきなのでしょうね。

4

誤記訂正

2017/10/05 02:38

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -38,8 +38,8 @@
38
38
 
39
39
  ---
40
40
 
41
- デコンパイル結果をjavaコードとして得たい場合、どこかからデコンパイルツールを見つけてくるとよいでしょう。自分はIntelliJ IDEAのplug-in(Femflower decompiler)を使ってます。使っているといってもIDEAを介して暗黙的に利用しているに過ぎませんが・・・
41
+ デコンパイル結果をjavaコードとして得たい場合、どこかからデコンパイルツールを見つけてくるとよいでしょう。自分はIntelliJ IDEAのplug-in(Fernflower decompiler)を使ってます。使っているといってもIDEAを介して暗黙的に利用しているに過ぎませんが・・・
42
- このFemflowerはplug-inとしてではなくスタンドアロンとしての利用もできるようですしjava8以降のbyte codeにも対応しているはずなので一応お奨めできると思います。デコンパイラーの中にはメンテが止まっていてjava8のbyte codeに対応していないものも見かけますので注意が必要です。
42
+ このFernflowerはplug-inとしてではなくスタンドアロンとしての利用もできるようですしjava8以降のbyte codeにも対応しているはずなので一応お奨めできると思います。デコンパイラーの中にはメンテが止まっていてjava8のbyte codeに対応していないものも見かけますので注意が必要です。
43
43
 
44
44
  ---
45
45
  訂正:

3

しりきれ文章訂正

2017/10/05 02:10

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -39,7 +39,7 @@
39
39
  ---
40
40
 
41
41
  デコンパイル結果をjavaコードとして得たい場合、どこかからデコンパイルツールを見つけてくるとよいでしょう。自分はIntelliJ IDEAのplug-in(Femflower decompiler)を使ってます。使っているといってもIDEAを介して暗黙的に利用しているに過ぎませんが・・・
42
- このFemflowerはplug-inとしてではなくスタンドアロンとしての利用もできるようですしjava8以降のbyte codeにも対応しているはずなので一応お奨めできると思います。デコンパイラーの中にはメンテが止まっていてjava8のbyte codeに対応していないものも見かけますので。
42
+ このFemflowerはplug-inとしてではなくスタンドアロンとしての利用もできるようですしjava8以降のbyte codeにも対応しているはずなので一応お奨めできると思います。デコンパイラーの中にはメンテが止まっていてjava8のbyte codeに対応していないものも見かけますので注意が必要です
43
43
 
44
44
  ---
45
45
  訂正:

2

誤記訂正

2017/10/04 14:15

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -31,7 +31,7 @@
31
31
  なので、次に示すjavaコード相当であることが見て取れます。
32
32
 
33
33
  ```java
34
- private void EnumTest2(String name, int ordinal) {
34
+ private EnumTest2(String name, int ordinal) {
35
35
  super(name, ordinal);
36
36
  }
37
37
  ```
@@ -39,4 +39,9 @@
39
39
  ---
40
40
 
41
41
  デコンパイル結果をjavaコードとして得たい場合、どこかからデコンパイルツールを見つけてくるとよいでしょう。自分はIntelliJ IDEAのplug-in(Femflower decompiler)を使ってます。使っているといってもIDEAを介して暗黙的に利用しているに過ぎませんが・・・
42
- このFemflowerはplug-inとしてではなくスタンドアロンとしての利用もできるようですしjava8以降のbyte codeにも対応しているはずなので一応お奨めできると思います。デコンパイラーの中にはメンテが止まっていてjava8のbyte codeに対応していないものも見かけますので。
42
+ このFemflowerはplug-inとしてではなくスタンドアロンとしての利用もできるようですしjava8以降のbyte codeにも対応しているはずなので一応お奨めできると思います。デコンパイラーの中にはメンテが止まっていてjava8のbyte codeに対応していないものも見かけますので。
43
+
44
+ ---
45
+ 訂正:
46
+ コンストラクターなのにメソッドの型voidを書いていたので訂正しました orz
47
+ 失礼しました。

1

誤記訂正

2017/10/04 14:12

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,4 +1,4 @@
1
- まず最初に、参照しておられるqiitaページの著者さんはjavapとは異なるコンパイラー(逆アセンブルツール)を利用していると思います。javapはbyte codeのダンプは可能ですが、それに対応するjavaコードを表示する機能はなかったと思います。
1
+ まず最初に、参照しておられるqiitaページの著者さんはjavapとは異なるコンパイラー(逆アセンブルツール)を利用していると思います。javapはbyte codeのダンプは可能ですが、それに対応するjavaコードを表示する機能はなかったと思います。
2
2
 
3
3
  ということを踏まえて・・・
4
4