【问题标题】:Dealing with or casting an object returned from method.invoke() when using reflection使用反射时处理或转换从 method.invoke() 返回的对象
【发布时间】:2012-04-21 20:13:47
【问题描述】:

使用 Java,我有一个方法,我用 method.invoke 调用它返回一个字符串。 Method.invoke 返回一个对象,但它不能转换为字符串。 我应该如何将 Object 用作​​字符串??

在反思文档中,它显示以下内容:

Object o = m.invoke(t, new Locale(args[1], args[2], args[3]));
out.format("%s() returned %b%n", mname, (Boolean) o);

但是我的代码这样做了,我得到了一个异常:java.lang.Class cannot be cast to java.lang.String

这是一个抽象类 - 然后会有几个 bean 的实现。

            Method[] methods = this.getClass().getMethods();
    for (Method method : methods) {
        if (isMethodGetter(method)) {
            
            try {

                Object message = method.invoke(this); // expect a string    
                       Object message = method.invoke(this); // expect a string
                
                if (message == null) {
                    // no messeage
                } else {
                    logger.debug("Calling listAnswers: got an answer: "
                            + message);

                    // create an answer object from the reflected
                    Answer answer = new Answer();
                    answer.setText((String)message);//cast as string
                    answerList.add(answer);
        }

编辑:根据以下答案,我在验证时遇到问题。

【问题讨论】:

    标签: java exception object reflection casting


    【解决方案1】:

    很简单:您没有得到java.lang.String 的实例,而是java.lang.Class 的实例。您在评论中的澄清使一切变得一清二楚:java.lang.Object.getClass 方法通过了您的 isMethodGetter 测试,但这并不是您想要的。只需增强检查代码以不让确切的名称 getClass 通过。

    【讨论】:

    • 没什么特别的,但我会为遇到此问题的其他人编辑问题...也许我在做一些有趣的事情:) Method[] methods = this.getClass().getMethods() ; for (Method method : methods) { if (isMethodGetter(method)) { try { Object message = method.invoke(this); // 期望一个字符串
    • 是的,你是 100% 正确的。我检查了日志并注意到 getClass 确实出现在调试调试中 [com.prevacidecrm.questionaire.model.Questionaire listAnswers] = Calling listAnswers: got an answer: class com.prevacidecrm.questionaire.model.impl.PerksEntryQuestionaire。太棒了 - 谢谢。
    【解决方案2】:

    我认为,如果您收到 ClassCastException,那么您需要检查您是否确实调用了正确的方法。但是为了有帮助,如果实际上你期望的是一个字符串,如果返回的对象不为空,也许你可以调用 toString() 方法。

    【讨论】:

    • 这就是我所做的并且它有效。如果需要另一种类型,我很想看看如何正确地做到这一点。
    • @JasonG 阅读我更新的答案。您的情况一目了然,很容易解决。
    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2010-12-15
    • 2018-11-10
    相关资源
    最近更新 更多