1

我因此配置了一个状态机:

    StateMachineTransitionConfigurer transitions = builder.configureTransitions();
    transitions.withChoice().source(CHOICE). //
    first(A, aGuard). //
    then(B, bGuard). //
    last(C);

然后,在不同的地方,我想从这个配置中获得选择转换。而我可以通过以下方式轻松获得选择状态:

    for (final State smState : stateMachine.getStates()) {
        if (smState.getPseudoState() != null && smState.getPseudoState().getKind() == PseudoStateKind.CHOICE) {
// smState is a choice state
        }
    }

我不知道如何从这些选择状态(上面的“first”、“then”和“last”)获取转换列表。

似乎无法访问此信息。我对吗?

4

2 回答 2

1

状态机有:

Collection<Transition<S,E>> getTransitions()

并且Transition您需要检查源或目标

State<S,E> getSource();
State<S,E> getTarget()
于 2015-08-29T07:37:35.557 回答
0

我们最终通过反省 ChoicePseudoState 的“choices”属性解决了这个问题,由于某种原因,没有访问器:

    final Field choicesField = ChoicePseudoState.class.getDeclaredField("choices");
    choicesField.setAccessible(true);

    for (final State<SessionStateType, SessionEvent> smState : stateMachine.getStates()) {
        if (smState.getPseudoState() != null && smState.getPseudoState().getKind() == PseudoStateKind.CHOICE) {
            final ChoicePseudoState<SessionStateType, SessionEvent> choice = ((ChoicePseudoState<SessionStateType, SessionEvent>) smState
                .getPseudoState());
            final List<ChoiceStateData<SessionStateType, SessionEvent>> choices = (List<ChoiceStateData<SessionStateType, SessionEvent>>) choicesField
                .get(choice);

...
于 2015-09-01T07:56:34.653 回答