リフレクションで取得した例外クラスをスローする方法

リフレクションで例外クラスの取得してスローする方法のサンプルコードです。

今回生成するクラスでキャストはしたくなかったので、
キャストせずに書く方法を考えたわけですが、ぱっと書き方がわからず。
結局調べて解決したんですが、ほしい情報になかなかヒットしなかったので残しておく。

書き方は以下の感じになります。

◆ 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しようとしているわけなんで、
当然コンパイルが通るわけありませんね。(今思うとはずかしい・・・)



今になっても構文エラーで迷うことがあるって精進が足りないなと思う今日この頃です。
日々勉強ですね。