Java
【初学者向け】JJUG ナイトセミナ 「Javaのプログラムはどうやって動いているの?」
https://www.youtube.com/watch?t=23&v=QNJBcrSayME
これを実際に試してみた。
javap を使ってバイトコードの逆アセンブルをする。
javap –p –c クラス名
とすると–p オプションで private メソッドも対象になる。-c オプションを付けるとバイトコードも出力される。
やってみた。
add() メソッドは動画で詳しく説明されていたので良く解る。
これでお終いではちょっとさみしいので Java 8 から導入されたインタフェースのデフォルトメソッドを使うようにプログラムを変更してみる。
Java 7 まではインタフェースにメソッドの実装は許されてなかった。
Java 8 からは default メソッドとして可能となりました。
いったいどうなっているのでしょうか?
javap で覗いてみることにします。今度は –v オプションを使ってバイトコードと定数プールも出力させてみます。
この結果から解るようにインタフェース側にメソッドの実装がされています。
おもしろいですね!
しかし、部分的にバイトコードを知ることができたのですがまだまだ解らないことだらけなので次回開催を楽しみに待ってます。
TAGS: Java |
2015年4月25日2:13 PM |
Java
【初学者向け】JJUG ナイトセミナ 「Javaのプログラムはどうやって動いているの?」が昨晩開催されていました。
私は仕事の都合上、生配信を見ることはできませんでした。
うれしいことに YouTube に動画がアップされてましたので見させていただきました。
https://www.youtube.com/watch?t=23&v=QNJBcrSayME
今までネット上とか雑誌で仕組みが解説された記事を読んだことはあるのですがあまり良く理解できませんでした。
今回は初学者向けと言うことで非常に優しく解説され、動画ということもあり内容的にも面白く楽しめたのが良かったです。
JVM がスタックマシンであって実際にどのように動いているか簡単な足し算のメソッドを例にとって解説されていました。
これだけ見てるとシンプルな仕組みなんだなって思ってしまいます。
実際はもっと複雑な仕組みの上で動作しているのだろうけど JVM が身近になったような気にさせられます。
【初学者向け】としてこの続きが開催され、今回のように動画がアップされることを期待します。
さて、このセミナの中でクイズが出題されました。
このクイズは #てらだよしおがんばれ と言うハッシュタグで有名な Java エバンジェリストの寺田佳央さんが作られたものを改変したものらしいです。
このクイズ正解者は 0 でした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
package anniversary; import java.time.Year; public class Anniversary { public static Anniversary ANNIVERSARY = new Anniversary(); private static int BIRTH_YEAR = Year.of(1995).getValue(); private static int THIS_YEAR = Year.now().getValue(); private final int age; private Anniversary(){ age = THIS_YEAR - BIRTH_YEAR; } public int getAge(){ return age; } public static void main(String... args) { System.out.println("The " + ANNIVERSARY.getAge() + "th Anniversarry!"); } } |
実行結果は次のようになります。
The 0th Anniversarry!
この問題を出題する前に static の初期化の説明がされていました。
にもかかわらず全員不正解という結果に櫻庭さんが動揺している様子がなんともいえなかった。
そういう私も問題を見たときに「・・・んん?」ってなりました。
だって普通なら変数(定数)宣言の前にそれらを使うインスタンス生成(コンストラクタ呼び出し)のコードなんて見ないもんね。
この問題を解くにあたって素直に The 20th Anniversarry! は無いとする。
残りみっつ。
The 2015th Anniversarry! は四択にするために苦し紛れに選択肢にあげたもの。
残りふたつ。
Exception だとすると何処で?
出るようなところは見当たらない。
よって、The 0th Anniversarry! が答えとなる。
何故か?
それはさっき説明にあった static の性質を利用したものだと推測される。
このプログラムで鍵となるのは static くらいしか見当たらないしね。
ちなみに、はじめ寺田佳央さんも間違えたらしいです。
これ、最初にクイズだといって出題されていたから解るけど何気に読んで実行したら「なんでやねん!」ってなってしまう自分の姿が目に浮かびます。
static なフィールドにはたとえ final であっても null とか 0 なんかで初期化されてしまうので注意が必要です。
解答の説明でこの問題を解決するにはインスタンス生成の(コンストラクタ呼び出し)コードを変数(定数)宣言の後にしてしまうのが解決方法になります。
ならば、私は無理矢理違う必要の無い方法で。(^_^;)
定数と言えば enum ですよね。
enum が使えるようになってからは
public static final int HOGE = 1963;
なんて書くのはダサいとか言い出していた人もいました。
私はそこまで思わなくて選択肢が一つ増えたなぁってくらいです。
で、さっきのクイズを enum を使うとこうなるのかな?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
package anniversary; import java.time.Year; public class Anniversary { public static Anniversary ANNIVERSARY = new Anniversary(); private enum YEAR{ BIRTH_YEAR (Year.of(1995).getValue()), THIS_YEAR (Year.now().getValue()); private final int value; private YEAR(int value) { this.value = value; } public int getValue() { return value; } } private final int age; private Anniversary(){ age = YEAR.THIS_YEAR.getValue() - YEAR.BIRTH_YEAR.getValue(); } public int getAge(){ return age; } public static void main(String... args) { System.out.println("The " + ANNIVERSARY.getAge() + "th Anniversarry!"); } } |
実行結果は次のようになります。
The 20th Anniversarry!
初期化の値って SJC-P ネタであったような・・・
今日の教訓 static は final であっても要注意!
TAGS: Java |
2015年4月25日7:57 AM |