簡體   English   中英

Java通用方法,使用反射使用任何構造函數實例化任何類

[英]Java Generic Method to Instantiate any Class with any Constructor using Reflection

眾所周知,Java使用擦除,因此任何泛型類都無法做到

T t = new T();

因此,我嘗試使用Java反射來創建一個帶有Static方法的類,以實例化具有任何Constructor的任何Class。 這是代碼。

import java.lang.reflect.*;

public class GenericNewInstance {
    public static <T> T createInstance(Class<T> cObj) {
        try {
            return cObj.newInstance();
        } catch (InstantiationException e) {
            System.out.println("Instantiation Exception");
            return null;
        } catch (IllegalAccessException e) {
            System.out.println("Illegal Access Exception");
            return null;
        }
    }

    public static <T> T createInstanceUsingRelection(Class<T> c, Object... initArgs) {
        Constructor<T> cTor = null;
        Class<?>[] cObjs = new Class<?>[initArgs.length];
        int i = 0;

        for(Object o : initArgs) {
            cObjs[i++] = o.getClass();
        }

        try {
            cTor = c.getConstructor(cObjs);
        } catch (SecurityException e) {
            System.out.println("security exception. Cannot get Constructor");
            return null;
        } catch (NoSuchMethodException e) {
            System.out.println("NoSuchMethodException Cannot get constructor");
            return null;
        }

        try {
            return cTor.newInstance(initArgs);
        } catch (IllegalArgumentException e) {
            System.out.println("Illegal Argument Exception");
            return null;
        } catch (InstantiationException e) {
            System.out.println("Instantiation Exception");
            return null;
        } catch (IllegalAccessException e) {
            System.out.println("Illegal Access Exception");
            return null;
        } catch (InvocationTargetException e) {
            System.out.println("Invocation Target Exception");
            return null;
        }
    }
}

使用此示例。

Integer i = GenericNewInstance.createInstanceUsingRelection(Integer.class, "0");

所以我的問題是:

  1. 這是實現它的正確方法嗎? (還是冗長?)
  2. 這樣做的典型用例是什么?
  3. 我們可以/應該避免在使用泛型時使用反射嗎?

您的代碼將在c.getConstructor(cObjs)處失敗,因為這沒有考慮類型層次結構。 如果任何參數是構造函數的聲明的param類型的子類型,則此調用不會返回它。 您需要更多類型的雜耍才能使其正常工作。 我建議您看一下已經解決了這個問題代碼 也許您甚至可以選擇使用該庫。 這是Clojure的實現代碼,Clojure是一種基於JVM的動態語言,正好需要這些東西。 該庫可從Maven中央存儲庫中獲得。

順便說一句,您的異常處理是多余的。 只需聲明throws Exception或捕獲任何Exception並將其包裝在RuntimeException 當某件事失敗時,原始異常是最好的診斷方法。

暫無
暫無

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

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