使用代码生成来创建类似的Java Action类

时间:2018-04-04 13:45:11

标签: java code-generation netbeans-platform

我使用应用程序框架(Netbeans Platform)在Java中构建GUI应用程序,这需要大量几乎相同的类来实现非常相似的Action类。我花了很多时间尝试以编程方式生成这些操作。虽然我能够生成Actions,但是框架在编译期间使用注释来生成其他内部缓存/数据文件,而这些文件是我无法使用编程方法重现的。

我想知道代码生成工具是否是更好的解决方案,或者是否包含框架注释的一些自定义注释。也许像Lombok,或者像maven插件。但不知道从哪里开始,我不确定这是否是一条探索的好路。理想情况下,我认为在数据文件中定义操作并在编译时生成Java代码会很棒。

该项目是开源的,and a number of other actions are on github。以下是模板外观的示例,我需要注入的部分替换为{{string}}{{code}}{{int}}

// imports omitted

@ActionID(
        category = {{string}},
        id = {{string}})
@ActionRegistration(
        iconBase = {{string}},
        displayName = "resources.MessagesBundle#" + {{string}},
        lazy = false)
@ActionReferences({
        @ActionReference(
                path = {{string}},
                position = {{int}})
})
public final class {{string}} extends AbstractAction implements UGSEventListener {

    public static final String ICON_BASE = {{string}};

    private BackendAPI backend;

    public SoftResetAction() {
        this.backend = CentralLookup.getDefault().lookup(BackendAPI.class);
        this.backend.addUGSEventListener(this);

        putValue("iconBase", ICON_BASE);
        putValue(SMALL_ICON, ImageUtilities.loadImageIcon(ICON_BASE, false));
        putValue("menuText", {{string}});
        putValue(NAME, {{string}});

    }

    @Override
    public void UGSEvent(UGSEvent cse) {
        java.awt.EventQueue.invokeLater(() -> setEnabled(isEnabled()));
    }

    @Override
    public boolean isEnabled() {
        {{code}}
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        {{code}}
    }
}

2 个答案:

答案 0 :(得分:1)

您应该尝试使用类似Telosys(http://www.telosys.org/)的代码生成器

该工具是为这种情况而设计的,您只需为每种重复性类创建一个模板并启动生成。

有关更多信息,请参见模板原理:http://www.telosys.org/templates.html

所有内容都是免费的开源软件,因此您可以重复使用现有模板并根据需要对其进行调整。

有关此工具的一些有趣文章:

答案 1 :(得分:-1)

你可以像打击一样使用公共Action类设计。这只是示例代码的一部分。如果某些模块具有自己的biz逻辑,则可以将此PubAction实现到任何子类。

import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.swing.AbstractAction;


public abstract class PubAction
  extends AbstractAction
  implements AppEventListener
{
  protected ActionInterceptor interceptor;
  protected IExceptionHandler exceptionHandler;
  protected IActionStatusJudge actionStatusJudge = null;

  public static final String TOOLBAR_SHOWNAME_KEY = "TOOLBAR_SHOWNAME_KEY";

  public PubAction()
  {
    setShowNameInToolbar(false);
  }

  public String getBtnName() {
    return (String)getValue("Name");
  }

  public void setBtnName(String btnName) {
    putValue("Name", btnName);
  }

  public void setCode(String code)
  {
    putValue("Code", code);
  }

  public void handleEvent(AppEvent event)
  {
    updateStatus();
  }

  public void updateStatus()
  {
    boolean isEnable = isActionEnable();
    setEnabled(getActionStatusJudge() == null ? isEnable : getActionStatusJudge().isActionEnable(this, isEnable));
  }

  protected boolean isActionEnable() {
    return true;
  }

  public void setShowNameInToolbar(boolean isShow)
  {
    putValue("TOOLBAR_SHOWNAME_KEY", isShow ? Boolean.TRUE : Boolean.FALSE);
  }

  public void actionPerformed(ActionEvent e) {
    Logger.debug("Entering " + getClass().toString() + ".actionPerformed");
    beforeDoAction();
    try
    {
      if ((interceptor == null) || (interceptor.beforeDoAction(this, e)))
      {
        try
        {
          doAction(e);
          if (interceptor != null) {
            interceptor.afterDoActionSuccessed(this, e);
          }
        } catch (Exception ex) {
          if ((interceptor == null) || (interceptor.afterDoActionFailed(this, e, ex)))
          {
            if (getExceptionHandler() != null)
            {
              processExceptionHandler(ex);
            }
            else if ((ex instanceof RuntimeException))
            {
              throw ((RuntimeException)ex);
            }

            throw new RuntimeException(ex);
          }
        }
      }
    }
    finally
    {
      Logger.debug("Leaving " + getClass().toString() + ".actionPerformed");
    }
  }



  protected void processExceptionHandler(Exception ex)
  {
    new ExceptionHandlerUtil().processErrorMsg4SpecialAction(this, getExceptionHandler(), ex);
  }

  protected void beforeDoAction()
  {
    Method[] ms = getClass().getMethods();
    for (Method m : ms)
    {
      Class<?> clazz = m.getReturnType();
      if (AbstractUIAppModel.class.isAssignableFrom(clazz)) {
        try
        {
          AbstractUIAppModel model = (AbstractUIAppModel)m.invoke(this, null);
          if (model == null)
            return;
          LoginContext ctx = model.getContext();
          if (ctx == null)
            break;
          ShowStatusBarMsgUtil.showStatusBarMsg("", ctx);
        } catch (IllegalArgumentException e) {
          Logger.debug(e.getMessage());
        } catch (IllegalAccessException e) {
          Logger.debug(e.getMessage());
        } catch (InvocationTargetException e) {
          Logger.debug(e.getMessage());
        }
      }
    }
  }

  public abstract void doAction(ActionEvent paramActionEvent) throws Exception;

  public ActionInterceptor getInterceptor()
  {
    return interceptor;
  }

  public void setInterceptor(ActionInterceptor interceptor) {
    this.interceptor = interceptor;
  }

  public IExceptionHandler getExceptionHandler() {
    return exceptionHandler;
  }

  public void setExceptionHandler(IExceptionHandler exceptionHandler) {
    this.exceptionHandler = exceptionHandler;
  }

  public IActionStatusJudge getActionStatusJudge() {
    return actionStatusJudge;
  }

  public void setActionStatusJudge(IActionStatusJudge actionStatusJudge) {
    this.actionStatusJudge = actionStatusJudge;
  }
}