繁体   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