Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Javaでマサカリ投げてみた

JJUG CCC 2015 Fall の懇親会で行ったライトニングトークの資料です。

解説記事を書きました!
http://d.hatena.ne.jp/chiheisen/20151129/1448817036

使用したソースコードはこちら
https://github.com/YujiSoftware/Masakari4j

  • Be the first to comment

Javaでマサカリ投げてみた

  1. 1. Javaでマサカリ 投げてみた! @YujiSoftware
  2. 2. 「マサカリを投げる」とは • 技術的な内容に対し 容赦のない厳しい指摘をすること – 投げられた相手が指摘を冷静にキャッチできず、 大きなダメージを受けてしまう危険な行為 • これをJavaで表現すると、こうなります
  3. 3. マサカリ投げる throw new Masakari();
  4. 4. このコードの問題点 • コンパイルが通らない – Javaで投げられるのは例外だけ (正確にはThrowableを継承したクラスだけ) – ただのオブジェクトであるマサカリは投げられな い…
  5. 5. しかし、私はマサカリを投げたい
  6. 6. どうしても投げたい
  7. 7. なんとしてでも投げたい!!
  8. 8. そこで、こんな方法で コンパイルしてみました
  9. 9. コンパイル方法 1. Masakariクラスを、Exceptionを継承した状態 でコンパイル public class Masakari extends Exception { }
  10. 10. コンパイル方法 2. throw new Masakari(); を含んだMainクラス をコンパイル public static void main(String... args) throws Exception { Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler()); try { throw new Masakari(); } catch (Throwable t) { System.out.println("Catch Masakari."); } } このコードは、マサカリがスローされたとき、 「Catch Masakari. 」または「Unhandled Masakari.」(コードは省略)と出力
  11. 11. コンパイル方法 3. Masakariクラスを、Exceptionの継承を削除し た状態に戻し、再度コンパイル public class Masakari { }
  12. 12. コンパイル結果 • 2つのクラスができあがる Masakariクラス(ただのオブジェクト) Mainクラス(Masakariをスローするクラス)
  13. 13. それでは実行してみましょう!
  14. 14. C:Masakari4j>java Main
  15. 15. C:Masakari4j>java Main Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.VerifyError: Bad type on operand stack Exception Details: Location: Main.main([Ljava/lang/String;)V @25: athrow Reason: Type 'Masakari' (current frame, stack[0]) is not assignable to 'java/lang/Throwable' Current Frame: bci: @25 flags: { } locals: { '[Ljava/lang/String;' } stack: { 'Masakari' } Bytecode: 0x0000000: bb00 0259 b700 03b8 0004 b200 0512 06b6 0x0000010: 0007 bb00 0859 b700 09bf 4cb2 0005 120b 0x0000020: b600 07b2 0005 120c b600 07a7 000e 4db2 0x0000030: 0005 120c b600 072c bfb1 Exception Handler Table: bci [10, 26] => handler: 26 bci [10, 35] => handler: 46 Stackmap Table: same_locals_1_stack_item_frame(@26,Object[#24]) same_locals_1_stack_item_frame(@46,Object[#24]) same_frame(@57) at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Unknown Source) at java.lang.Class.privateGetMethodRecursive(Unknown Source) at java.lang.Class.getMethod0(Unknown Source) at java.lang.Class.getMethod(Unknown Source)
  16. 16. なんかわけわからんエラー出た ( ̄▽ ̄;)
  17. 17. 何が起きた? •VerifyErrorが起きた – VerifyError とは • クラスファイルの内部矛盾またはセキュリティー上の 問題があることを検出した場合にスローされるエラー – 要するに… • マサカリを投げようとしているのがJava VMにばれて実 行できなかった
  18. 18. Javaでマサカリ 投げられない…
  19. 19.
  20. 20. …って思うでしょ?
  21. 21. 最終手段! •-noverifyオプション – VerifyErrorを抑止! • これを付けて実行すると…!
  22. 22. C:Masakari4j>java –noverify Main Unhandled Masakari.
  23. 23. Javaでマサカリ 投げられる!
  24. 24. そして、コードをよく見ると… • try...catch… がある!? – にもかかわらず、catchブロックを通らなかった! public static void main(String... args) throws Exception { Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler()); try { throw new Masakari(); } catch (Throwable t) { System.out.println("Catch Masakari."); } }
  25. 25. Javaでマサカリ Catchできない! つまり
  26. 26. これぞまさしくマサカリ!
  27. 27. いかがだったでしょうか 最後に大事なことをお伝えします
  28. 28. 注意事項 • マサカリを投げる行為は大変危険です よい子のみんな まねしないでね!
  29. 29. Javaでマサカリ 投げてみた! @YujiSoftware
  30. 30. 本LTに対するマサカリは 受け付けていません! ご了承ください やさしく教えてください (*^-^*)

    Be the first to comment

    Login to see the comments

  • nyamada43

    Jun. 11, 2017

JJUG CCC 2015 Fall の懇親会で行ったライトニングトークの資料です。 解説記事を書きました! http://d.hatena.ne.jp/chiheisen/20151129/1448817036 使用したソースコードはこちら https://github.com/YujiSoftware/Masakari4j

Views

Total views

7,886

On Slideshare

0

From embeds

0

Number of embeds

3,829

Actions

Downloads

3

Shares

0

Comments

0

Likes

1

×