在java方法中获取返回语句

在java方法中获取返回语句,java,Java,如何在java中获取方法的所有可能返回值 例如: Object onEvent() { if (condition) { return "a"; } if (condition2) { return "b"; } if (condition3) { return "c"; } } 我需要这样的东西: String[] returns = Utils.getReturnStatements("object.onEvent()"); returns

如何在java中获取方法的所有可能返回值

例如:

Object onEvent() {
 if (condition) {
     return "a";
 }

 if (condition2) {
    return "b";
 }

 if (condition3) {
     return "c";
 } 

}
我需要这样的东西:

String[] returns = Utils.getReturnStatements("object.onEvent()");
returns = ["a", "b", "c"]
Object onEvent() {

    List<String> list = new ArrayList<String>();    

    if (condition) {
        list.add("a");
    }

    if (condition2) {
        list.add("b");
    }

    if (condition3) {
        list.add("c");
    }

    return list.toArray();

}
Object onEvent(List<Object> rets) {
 String ret = "";
 rets.add("a");
 rets.add("b");
 rets.add("c");

 if (condition) {
     ret = "a";
 }

 if (condition2) {
    ret = "b";
 }

 if (condition3) {
     ret = "c";
 } 
 return ret;
}
List<Object> returns = new ArrayList<Object>();
Object retVal = obj.onEvent(returns);

您只能检索方法签名,在本例中,该方法签名将是
对象
,作为返回类型


要获得更多详细信息,您需要静态分析源代码或返回类型,例如
enum

您不能在Java中执行这样的操作,但您可以执行以下操作:

String[] returns = Utils.getReturnStatements("object.onEvent()");
returns = ["a", "b", "c"]
Object onEvent() {

    List<String> list = new ArrayList<String>();    

    if (condition) {
        list.add("a");
    }

    if (condition2) {
        list.add("b");
    }

    if (condition3) {
        list.add("c");
    }

    return list.toArray();

}
Object onEvent(List<Object> rets) {
 String ret = "";
 rets.add("a");
 rets.add("b");
 rets.add("c");

 if (condition) {
     ret = "a";
 }

 if (condition2) {
    ret = "b";
 }

 if (condition3) {
     ret = "c";
 } 
 return ret;
}
List<Object> returns = new ArrayList<Object>();
Object retVal = obj.onEvent(returns);

正如@Johan所说,这是不可能的。如果确实需要,唯一的方法是将这些可能的结果存储在映射方法名称到列表或数组的映射中,或者更好,如果可能,使用枚举

编辑:


在阅读了您的评论之后,我认为您应该使用一个HashMap,其中一个节点作为键,一个列表作为值。分析节点时,在列表中创建退出节点列表,然后将该列表映射到该节点。

首先删除多个返回:

另外,要获得所有返回类型,只需将对象列表传递给您的方法,并更改
onEvent
代码如下:

String[] returns = Utils.getReturnStatements("object.onEvent()");
returns = ["a", "b", "c"]
Object onEvent() {

    List<String> list = new ArrayList<String>();    

    if (condition) {
        list.add("a");
    }

    if (condition2) {
        list.add("b");
    }

    if (condition3) {
        list.add("c");
    }

    return list.toArray();

}
Object onEvent(List<Object> rets) {
 String ret = "";
 rets.add("a");
 rets.add("b");
 rets.add("c");

 if (condition) {
     ret = "a";
 }

 if (condition2) {
    ret = "b";
 }

 if (condition3) {
     ret = "c";
 } 
 return ret;
}
List<Object> returns = new ArrayList<Object>();
Object retVal = obj.onEvent(returns);
Object-onEvent(列表rets){
字符串ret=“”;
加上(“a”);
加上(“b”);
加上(“c”);
如果(条件){
ret=“a”;
}
如果(条件2){
ret=“b”;
}
如果(条件3){
ret=“c”;
} 
返回ret;
}
按如下方式调用OneEvent:

String[] returns = Utils.getReturnStatements("object.onEvent()");
returns = ["a", "b", "c"]
Object onEvent() {

    List<String> list = new ArrayList<String>();    

    if (condition) {
        list.add("a");
    }

    if (condition2) {
        list.add("b");
    }

    if (condition3) {
        list.add("c");
    }

    return list.toArray();

}
Object onEvent(List<Object> rets) {
 String ret = "";
 rets.add("a");
 rets.add("b");
 rets.add("c");

 if (condition) {
     ret = "a";
 }

 if (condition2) {
    ret = "b";
 }

 if (condition3) {
     ret = "c";
 } 
 return ret;
}
List<Object> returns = new ArrayList<Object>();
Object retVal = obj.onEvent(returns);
List returns=new ArrayList();
Object retVal=obj.onEvent(返回);

使用命令模式和
enum
有一个解决方法

public class OnEvent implements Command<EventInfo> {

    @Override
    public EventInfo execute() {
        // do some checking
        return EventInfo.A;
    }

    @Override
    public EventInfo[] getValues() {
        return EventInfo.values();
    }


    public static void main(String[] args) {
        OnEvent e = new OnEvent();
        EventInfo retVal = e.execute();
        EventInfo[] values = Utils.getReturnStatements(e);
    }

}

enum EventInfo {
    A, B, C;
}

interface Command<TYPE extends Enum<?>> extends KnownReturnValues<TYPE> { public TYPE execute(); }

interface KnownReturnValues<TYPE> { public TYPE[] getValues(); }

class Utils {

    private Utils() {}

    public static <TYPE extends Enum<?>> TYPE[] getReturnStatements(Command<TYPE> c) {
        return c.getValues();
    }
}
public类OnEvent实现命令{
@凌驾
公共事件信息执行(){
//检查一下
返回EventInfo.A;
}
@凌驾
公共事件信息[]获取值(){
返回EventInfo.values();
}
公共静态void main(字符串[]args){
OnEvent e=新的OnEvent();
EventInfo retVal=e.execute();
EventInfo[]values=Utils.getReturnStatements(e);
}
}
枚举事件信息{
A、 B,C;
}
接口命令>类型[]getReturnStatements(命令c){
返回c.getValues();
}
}

如果您只需要分析返回常量值的简单方法,例如示例中的方法,那么您可以通过使用ASM或类似字节码工具包的静态分析相对轻松地完成这项工作

对于与示例结构相匹配的方法(即只直接返回常量的方法),只需查找模式

LDC ???
ARETURN
并收集加载了LDC的常数。这将是非常简单的

如果这些方法可能更复杂,例如,如果它们返回分配给变量的值,则需要执行流分析。这是更多的工作,但ASM提供了支持


如果您正在分析的方法不是简单常量,而是返回值,那么通过静态分析实现这一点将非常困难/不可能。

这不是很好的编程实践,但是您可以创建一个包含3个公共数据成员的类,并使您的代码看起来像这样。(我称这个班为“myclass”)

然后,您需要另一个控制结构,它按照
如果(myclass.datamember!=null),请确保类数据成员中有值。同样,这不是一个好的编程实践,但它可以满足您的需要。

通过“获取返回语句”,您真的是指“获取所有可能的返回
值”
?这。。。编程语言并不是这样工作的。除了口齿不清。但是Java肯定没有内置的工具来在运行时分析代码结构。这是不可能的。你到底想用它做什么?@iberck:你为什么需要它?您将如何处理
return random.nextLong()
?这将使2^63-1成为可能的返回值。但是,您将在一个列表中包装原始返回值,而不是所有返回值,除非您在fors之外添加了add。这将打破一个事实,即如果条件为真,你仍将测试其他条件…@Matthieu:是的,已实现并编辑。虽然我不确定这是否是一种灵活的方法,但是你会测试所有的条件,即使你应该在第一次测试后退出…有没有静态分析源代码的库?