リフレクションで取得した例外クラスをスローする方法
リフレクションで例外クラスの取得してスローする方法のサンプルコードです。
今回生成するクラスでキャストはしたくなかったので、
キャストせずに書く方法を考えたわけですが、ぱっと書き方がわからず。
結局調べて解決したんですが、ほしい情報になかなかヒットしなかったので残しておく。
書き方は以下の感じになります。
◆ ExReflectionSample.java package com.example.reflection; public class ExReflectionSample { public static void main(String[] args) throws Exception { Class<? extends Exception> clazz = (Class) Class.forName("com.example.reflection.MyException"); try { throw clazz.getConstructor(String.class).newInstance("test"); } catch (Exception e) { e.printStackTrace(); } } } ◆ MyException.java package com.example.reflection; public class MyException extends Exception { public MyException() { super(); } public MyException(String message) { super(message); } }
・How to throw exception class obtained by reflection
https://gist.github.com/atsushi-kitazawa/06229bce7aefd44edccdd62d7a56528f
最初思いついたのは以下のようなコードだったのですが、
これだと★箇所でコンパイルエラーになってしまいます。
package com.example.reflection; public class ExReflectionSample { public static void main(String[] args) throws Exception { Class<? extends Exception> clazz = (Class) Class.forName("com.example.reflection.MyException"); throw clazz; ★ } }
エラーの内容は以下。
No exception of type Class<capture#2-of ? extends Exception> can be thrown; an exception type must be a subclass of Throwable
Classクラスをthrowしようとしているわけなんで、
当然コンパイルが通るわけありませんね。(今思うとはずかしい・・・)
今になっても構文エラーで迷うことがあるって精進が足りないなと思う今日この頃です。
日々勉強ですね。