【问题标题】:Create and Return an Object Based on a Passed String基于传递的字符串创建并返回对象
【发布时间】:2013-06-06 18:35:04
【问题描述】:

有没有什么方法可以基于 Java 中传递的字符串创建和返回对象?我想创建作为 Package 类的子类的对象,并通过调用传递类名的方法来做到这一点。我可以很容易地使用 switch 语句来完成此操作,但如果我这样做,当我添加更多 Packages 子类时,我不必调整 switch 语句。

这是我的代码:

包变量:

private Package testPackage;

方法调用:

createPackage(testPackage, "TestPackage");

以及方法:

Object createPackage(Object curPackage, String packageName)
{   
    Object object = null;

    try
    {
        Class<?> aClass = Class.forName("a.b.c.packages." +packageName);
        Constructor<?> constructor = aClass.getConstructor(new Class[] { String.class });
        object = constructor.newInstance(new Object[] { packageName });
    } catch (Exception e)
    {
        e.printStackTrace();
    }

    return object;
}

找到了类,但是在我运行这个方法并尝试调用之后

Log.v(TAG, testPackage.getName());

我得到一个空指针异常。我正在编写 Android 代码,但我认为这在这种情况下没有什么不同。

【问题讨论】:

  • "我想创建一个 Package 类的子类的对象,并通过调用传递类名的方法来做到这一点" sniff sniff 看起来像代码异味……你到底想做什么?
  • stackoverflow.com/questions/6094575/… 你可以在这里找到更好的参考。
  • 我已经去过那个页面了。这就是我对代码的建模。
  • 而且这不是代码异味,如果我能实现这个简短的方法会节省很多代码。

标签: java string object reflection


【解决方案1】:

你有一个 NullPointerException 因为你没有初始化testPackage

你必须转换结果:

 testPackage = (Package)createPackage("TestPackage")

(也可以去掉第一个参数,没有用到)

【讨论】:

  • 当我使用 testPackage = createPackage(testPackage, "TestPackage"); 时,我得到“类型不匹配:无法从对象转换为包”
  • 你能发布 NullPointerException 的堆栈跟踪吗?
  • 我可以用泛型做这个吗?我不确定我需要做什么来设置它。我以前使用过泛型,但绝对不是在这种情况下。
  • 现在我得到一个 ClassCastException。我之前也尝试过这个解决方案。
  • 如果您有 ClassCastException,请检查 a.b.c.packages.TestPackage 是否是 Package 的子类
【解决方案2】:

所以我相信你的问题是你从来没有在你的方法中分配你的变量curPackage(至少从你写的代码我可以看出)。您需要分配您的 testPackage,即:

private Package testPackage = (Package) createPackage("TestPackage");

此时您可以删除您的 Object 参数,因为它从未在方法中使用过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多