【问题标题】:Generating Java source code and jumps生成Java源代码和跳转
【发布时间】:2011-06-05 21:03:49
【问题描述】:

我正在动态生成 Java 代码,然后将其编译并重新加载。我的问题是我本质上需要跳转,因为当我从函数返回时,我希望从循环中的点继续执行已经退出。希望这里的代码能说明我的愿望。虽然实际的代码也会有一些 ifs 并且更深。

MyIter a,b,c;

boolean func() {
 jump to correct state here

 state0:

 a = ...;
 while (a.next()) {
   state1: while (b.next()) {
     return true; // start again at state1
   }
   b = ...;
 }

 c = ...;
 state2:
 while (c.next()) {
   return true; // start again at state2
 }
 return false;
}

在 C 语言中,我可能会使用跳转表和状态变量。性能是这里的关键,代码与 Java 应用程序交互。

到目前为止,我最好的猜测是:

  • 翻转循环嵌套和逻辑。这变得太麻烦和有问题了。
  • 添加逻辑以允许流程返回到原来的位置,但这可能会很混乱。
  • 我假设字节码可以跳转,所以我可以自己生成字节码,但这似乎并不理想(有什么好的库吗?)
  • 继续传递风格以避免回归,但这将涉及重大重组,尽管目前可能是这样。

我想知道是否有人有任何想法?

【问题讨论】:

  • 我认为即使在字节码中你也很难进行跳转 - 验证器有各种各样的规则,使字节码的灵活性比你想象的要低得多。

标签: java


【解决方案1】:

最简单的选择是使用 switch 块(或者如果必须,嵌套 switch 语句)

enum State {
   state1, state2, state3;
}

State state = State.state1;

public boolean func() {
   while(true) {
     switch(state) {
        case state1:
            if(test()) return true;
            state = state2;
            break;
        case state2:
            if(test2()) return false;
            state = state3;
            break;
        case state3:
            if(test3()) return true;
            state = state1;
            break;
      }
   }
}

【讨论】:

  • 谢谢。在演奏和思考之后,这看起来是我的最佳选择。一个快速的实现效果很好,虽然遗憾的是它有时会嵌套。
  • 您可以通过设置 state3_1, state3_2, ... state3_N 来展平状态。这可能会让事情更清楚,也可能不会。
【解决方案2】:

Java 协程库可能适合您的目的。请参阅this related StackOverflow question 获取一些提示。

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 2023-03-19
    • 2022-01-07
    • 2023-03-20
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2015-01-11
    • 2012-05-04
    相关资源
    最近更新 更多