簡體   English   中英

如何拋出通過反射創建的 Exception 類的實例?

[英]How do you throw an instance of an Exception class created through reflection?

我正在嘗試創建一個函數,該函數根據您傳入的類型引發異常。

private void myFunc(Class<?> exceptionType) {
   ...do some work...
   throw new exceptionOfTypeExceptionTypePassedIn(newMessage);
}

你能做這個嗎?

首先, throw語句僅適用於Throwable或其子類型的引用表達式。 因此,您傳遞給throw的表達式必須具有該類型。 您可以通過為exceptionType參數提供一個界限來實現這一點。

private void myFunc(Class<? extends Throwable> exceptionType) {

如果您現在想限制Throwable子類型的類型,您也可以這樣做。

如果是Exception ,則需要throws聲明

private void myFunc(Class<? extends Exception> exceptionType) throws Exception {

如果是RuntimeException ,則不會

private void myFunc(Class<? extends RuntimeException> exceptionType) {

根據您的需要,您實際上可能使該方法通用。 然后它看起來像這樣

private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T {

至於實際的反射邏輯,您假設相應的類型有一個可訪問的構造函數,它接受一個String參數。 如果沒有,Java 將拋出自己的各種異常。 你需要處理這些。

一個潛在的解決方案看起來像這樣( 的javadocClass#getConstructorjavadoc中Constructor#newInstance

private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T {
    final String message = "some message";
    try {
        throw exceptionType.getConstructor(String.class).newInstance(message);
    } catch (InstantiationException e) {
        e.printStackTrace();
        // rethrow
    } catch (IllegalAccessException e) {
        e.printStackTrace();
        // rethrow
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
        // rethrow
    } catch (InvocationTargetException e) {
        e.printStackTrace();
        // rethrow
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
        // rethrow
    } catch (SecurityException e) {
        e.printStackTrace();
        // rethrow
    }
}

顯然,您可以將所有這些異常類型折疊到一個多捕獲語句中。

請注意,如果您傳入的異常類型是現有catch語句中提到的異常類型之一,它將被吞下,即。 不扔。 您還可以將所有這些添加到自己的throws聲明中。

private static <T extends Throwable> void myFunc(Class<T> exceptionType) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, T {
    final String message = "some message";
    throw exceptionType.getConstructor(String.class).newInstance(message);
}

或者重新拋出包裹在RuntimeException的捕獲異常。

您可以在Class對象上使用newInstance方法。

反射相當混亂。 接受的答案有效,但您的代碼將更難以遵循。 您最好重構代碼以避免這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM