【问题标题】:How to create new object in GWT by string class-name?如何通过字符串类名在 GWT 中创建新对象?
【发布时间】:2019-05-09 16:59:37
【问题描述】:

我的目标是创建一个灵活的应用程序-> 扩展我的网络应用程序的功能,我只是向数据库添加一个位置并将缺少的类上传到服务器。

我在 Java-GWT 中创建了动态菜单。我使用 MenuBar() 和循环,所有位置都取自 db(数组,字符串)。 当然,菜单中的'end-option'必须做一些事情,一般点击后应用程序会打开,即带有按钮、标签、文本区域的FlowPanel。

我的想法是:使用 java 反射为菜单中的所有位置添加命令。 每个Command取选项名称(字符串),名称相同,如类名->next,点击后我会自动创建对象。不幸的是,Java 反射不适用于 GWT,所以这种方式是不可能的。

我的问题是:

当我在字符串中有类名时如何创建对象?或者如果我的想法是错误的,也许是创建灵活菜单/程序的其他方式?

【问题讨论】:

  • 一种选择是将字符串发送到服务器(通过 RPC),在服务器端创建对象并通过相同的 RPC 调用将其返回。请注意,返回类型将为Object,GWT 编译器将向您发出有关序列化性能的警告。
  • 如果类 - 由 String 表示 - 在编译时是已知的,您可以尝试创建类似此处提到的内容:stackoverflow.com/questions/3034881/…。请记住,反射在 GWT 中不可用,因为 JavaScript 没有反射。
  • 感谢您的所有建议。我仍在为我的问题寻找解决方案。我已经完成了第一步:我在命令中使用“延迟绑定”(在菜单栏中,但仍然是静态版本) - 在 FlowPanel 中,我动态使用在此方法中准备的任何对象。

标签: java reflection gwt eclipse-jee


【解决方案1】:

我的事,我找到了一个解决这个问题的小方法,但是有另一个概念——只有一个类(和一个接口);在这堂课中,我有一个主要方法,它选择正确的“打开方法”;在此示例中,我通过 int 进行检查:

/------------------------------ / 程序主要部分中的示例循环: /-------------------------------------------> (...)

MenuBar menu = new MenuBar(true);

    for (int k = 0; k < 5; k++) {
            int ii=k;
            menu.addItem(tekst + k, new Command() {

                @Override
                public void execute() {
                    ClassMetodInterface metoda = (ClassMetodInterface) GWT.create(Method2.class);
                    vPanel.clear(); //clearing before I open a new widget.

/*I sent int (easier to tests), but I can sent string[i] too*/
/* logging - instance of main class to communicate with 'subclasses', in my project necessery*/

                    vPanel.add(metoda.defaultMethod(ii, logging));  
                }

            });
        }
(...)
/*-------------------------------------------*/
ClassMetodInterface, only for implementation class Method2 :
/*-------------------------------------------*/
    public interface ClassMetodInterface {
    Widget defaultMethod(int g, Logging logging);
}

/*-------------------------------------------*/
class Method2 with swich:
/*-------------------------------------------*/


public class Method2 implements ClassMetodInterface {

    public Widget zapisUsera(int g, Logging logging) {

        Logging logging;
        HorizontalPanel lPanel = new HorizontalPanel();

        switch(g) {
        case 1: {
            Window.alert("switch for test no:"+g);
            MenuWindow1(logging);

            break;

        }
        case 2:{
            Window.alert("switch for test no:"+g);
            break;
        }
        default:
            Window.alert("switch default - loop >2 && <1");
            break;
        }
        return lPanel;  //all methods will be void - they will be add widgets and Panels to lPanel

    }

    public Widget MenuWindow1(Logging logging) {
        this.logging = logging;

        lPanel.setBorderWidth(2);
        this.lPanel.setPixelSize(100, 50); 
        Button b1 = new Button("test button, not used");    
        lPanel.add(b1);

        Label lbl = new Label("label no "+logging.i);       

        lPanel.add(lbl);
        Button addGlobal = new Button("+");
        Button removeGlobal = new Button("-");
        lPanel.add(addGlobal);
        addGlobal.addClickHandler(new addGlobal());
        removeGlobal.addClickHandler(new removeGlobal());
        lPanel.add(removeGlobal);


        return lPanel;

    }

//for tests communication with class, where I have menu and global variable
    public class addGlobal implements ClickHandler {

        @Override
        public void onClick(ClickEvent event) {
            logging.i++;
        }

    }

    public class removeGlobal implements ClickHandler {

        @Override
        public void onClick(ClickEvent event) {
            logging.i--;
        }

    }
}

它还没有完成,但你可以展示主要思想。如果我需要在菜单中添加新选项,我将更新 db 并用更多方法替换版本的一个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2013-08-18
    相关资源
    最近更新 更多