【问题标题】:Instantiate java class from name and memory issues on android从android上的名称和内存问题实例化java类
【发布时间】:2015-03-09 18:00:59
【问题描述】:

我使用此函数从其名称中实例化一个 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);

【问题讨论】:

  • 从您的问题中不清楚该代码如何发生“内存泄漏”。您能否详细说明您想要实现的目标?
  • 我尝试添加更多信息。感谢您的宝贵时间。

标签: java android class object memory


【解决方案1】:

我明白你想要做什么。您希望有一个通过反射实例化对象的通用构造函数。虽然这无疑是明智的,但让我们考虑一下它是否也是直观的:

是

adapter = (Adapter) getObjectFromName(parameters);

比

更清晰和直观
adapter = (Adapter) new Adapter(parameters);

当我们创建新的抽象时,我们需要考虑它们是否是

  • 高效。
  • 可重复使用且广泛适用。
  • 简单直观,即它们大大减少了程序员的工作量。

我个人认为创建这样的通用构造函数作为抽象并不特别有趣。当我通过调用它的一个构造函数来创建一个新对象时

Adapter adapter = new Adapter(this);

对于阅读我的代码的其他人来说,很明显我正在使用当前的 Activity 作为上下文创建一个类 Adapter 的新对象。

此外,正如您所说的,使用反射创建新的类实例比直接调用其构造函数效率低。

因此,您需要确定您打算创建的这种新抽象是否对您和其他阅读您的代码的人特别有益。

【讨论】:

  • 感谢您抽出宝贵时间 ZygoteInit。这种抽象的含义不是代码可读性,但是可以说我可以只使用约定来创建整个片段,我什至可以在给定对象类型(名称)的情况下实例化一个新片段,而无需创建类文件。我可以有 10 行来动态创建这 10 个片段,而不是有 10 个片段文件,每个片段有 10 个实例。看起来很有希望,但是我不知道这种方法是否可以在手机上使用,可能这种实现方式很重,应该只能在台式机上进行,您怎么看?
  • 我知道这样做的原因之一是避免代码重复。但事实是,您不会总是添加和删除Fragments,您还将执行其他操作。 FragmentManager 和 FragmentTransaction 类还有许多其他方法。如果我是你,我更愿意通过Fragment 明确知道我正在执行哪些操作。但它真的取决于你,你对这种方法的看法,如果你觉得它为你解决了更多的问题,那么你当然应该继续它......最好:)
  • @sagits:你在哪里接触到这个?
  • 我一直在我的项目中使用反射。我搜索了很多,发现没有整体性能问题。整体反射比泛型和普通实例化要慢,但人眼仍然无法察觉。
  • @sagits:如果您觉得此答案有用,请将其标记为正确。谢谢 :) .... 当然,人眼看不到它是对的。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多