Java:从库中访问用户生成的代码

时间:2015-11-08 21:06:06

标签: java

我正在为我的学生制作一个图书馆,以便用Java创建一个简单的GUI, 但如果他们按下界面中的按钮,它应该运行由他们创建的方法 有没有办法做到这一点? 我不是真正的Java,但课程要我:(

1 个答案:

答案 0 :(得分:0)

您可以使用反射来运行它们的类,而不需要它们实现接口,尽管您仍然必须提供限制参数类型的指令。这仅适用于没有参数的方法。

java.awt.EventQueue.invokeLater(() -> {
    JFrame frm = new JFrame();
    JPanel pnl = new JPanel();
    frm.add(pnl);
    pnl.setLayout(new BoxLayout(pnl, BoxLayout.Y_AXIS));
    pnl.add(new JLabel("Class"));
    JTextField classField = new JTextField();
    pnl.add(classField);
    pnl.add(new JLabel("Method"));
    JTextField methodField = new JTextField();
    pnl.add(methodField);
    JTextArea area = new JTextArea();
    area.setPreferredSize(new Dimension(300, 300));
    JButton btn = new JButton("Run");
    pnl.add(btn);
    pnl.add(area);
    System.setOut(new PrintStream(new OutputStream() {
        @Override
        public void write(int b) throws IOException {
            area.append(new String(new byte[]{(byte) b}));
        }
    }));
    btn.addActionListener(e -> {
        try {
            Class cls = Class.forName(classField.getText());
            Method m = null;
            Method ma[] = cls.getDeclaredMethods();
            String methodName = methodField.getText().trim();
            m = cls.getMethod(methodName,new Class[]{});
            Object o = cls.newInstance();
            Object mr = m.invoke(o);
            if(null != mr) {
                area.append("\nreturned "+mr.toString()+"\n");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            area.append("\nException "+ex.getMessage()+"\n");
        }
    });
    frm.pack();
    frm.setVisible(true);
});

给出一个类:

public class StudentClass {
    public void print10() {
        int sum= 0;
        for(int i = 0; i< 10; i++ ) {
            System.out.println("i = "+i);
            sum+=i;
        }
    }
}

字段需要填充StudentClassprint10,编译的类需要在您的类路径上。

也许更好的选择是教授处理(https://processing.org/)。这本质上是java,因为Processing代码会在幕后粘贴到一个java类中,但它更倾向于让初学者绘制图形草图。我想你不得不问你的管理部门是否愿意,并且在某些时候学生需要能够编写处理工具为他们生成的代码。