簡體   English   中英

從Android上的名稱和內存問題實例化Java類

[英]Instantiate java class from name and memory issues on android

im使用此函數從其名稱實例化Java類,並使用其構造函數參數,名稱,包和構造函數參數類型:

public Object getObjectFromName(Object[] parameters, String objectName, String packageName, Class[] types) {
    try {
        Class myClass = Class.forName(packageName + objectName);

        if (types == null) {
            types = new Class[parameters.length];

            for (int x = 0; x < parameters.length; x++) {
                types[x] = parameters[x].getClass();
            }
        }
        Constructor constructor = myClass.getConstructor(types);
        Object object = constructor.newInstance(parameters);
        return object;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

我打算在運行4.4的android設備上使用它來創建通用片段(遵循約定實例化其對象)。

它可以工作,但是我目前僅在一個對象上使用它,對5個或8個對象使用這種方法會導致內存泄漏嗎? 會比普通實例化慢嗎?


我的意思是,這是:

adapter = (Adapter) getObjectFromName(parameters);
object = (Object) getObjectFromName(parameters);
dao= (Dao) getObjectFromName(parameters);
object2 = (Object2) getObjectFromName(parameters);
object3 = (Object3) getObjectFromName(parameters);

速度(以及用戶感知)慢於:

adapter = (Adapter) new Adapter(parameters);
object = (Object) new Object(parameters);
dao= (Dao) new Dao(parameters);
object2 = (Object2) new Object2(parameters);
object3 = (Object3) new Object3(parameters);

我了解您要做什么。 您希望有一個通用的排序構造函數 ,該構造函數通過反射實例化對象。 盡管這無疑是明智的,但讓我們考慮一下它是否也很直觀

adapter = (Adapter) getObjectFromName(parameters);

比起更清晰 直觀

adapter = (Adapter) new Adapter(parameters);

當我們創建新的抽象時,我們需要考慮它們是否是

  • 高效。
  • 可重用且廣泛適用。
  • 簡單直觀,即它們大大減少了程序員的工作量。

我個人不認為創建這樣的通用構造函數作為抽象特別有趣。 當我通過調用其構造函數之一創建新對象時

Adapter adapter = new Adapter(this);

對於任何其他閱讀我的代碼的人來說,顯而易見的是,我正在使用當前Activity作為上下文創建類Adapter的新對象。

而且,正如您正確地說的那樣,使用反射來創建新的類實例比直接調用其構造函數效率低。

因此,您需要確定打算創建的新抽象對您和其他將閱讀您的代碼的人是否特別有益。

暫無
暫無

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

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