Java 如何在JLabel中显示JTextField的输入?如何修复反射中的错误?

Java 如何在JLabel中显示JTextField的输入?如何修复反射中的错误?,java,swing,reflection,jlabel,jtextfield,Java,Swing,Reflection,Jlabel,Jtextfield,我必须这样做:我有一个JTextField和按钮。当我写入该文本字段时,输出必须在JLabel中显示结果 要求用户提供类的名称 使用Class.forName()获取对Java反射API的访问权 使用默认构造函数创建类的新实例(即对象) 查找并显示窗体中类的所有字段,包括继承的字段: 字段类型字段名称:(字段值(JTextField))(设置(按钮)) 字段值必须是文本框,以便用户可以按“设置”按钮更改值。新值必须更新到对象。如果字段包含复杂类型(对象、集合等)的值,则不应创建文本框和“设置”按

我必须这样做:我有一个JTextField和按钮。当我写入该文本字段时,输出必须在JLabel中显示结果

  • 要求用户提供类的名称
  • 使用Class.forName()获取对Java反射API的访问权
  • 使用默认构造函数创建类的新实例(即对象)
  • 查找并显示窗体中类的所有字段,包括继承的字段:
  • 字段类型字段名称:(字段值(JTextField))(设置(按钮))

    字段值必须是文本框,以便用户可以按“设置”按钮更改值。新值必须更新到对象。如果字段包含复杂类型(对象、集合等)的值,则不应创建文本框和“设置”按钮

  • 查找并显示类的所有方法,包括继承的方法: 返回类型方法名称(参数类型1(参数值1(JTextField)),参数类型2(参数值2(JTextField)),…(调用(按钮))
  • 如果方法具有复杂类型(对象、集合等)的参数,则只显示参数类型,跳过参数值文本框和“调用”按钮。 当用户按下“invoke”按钮时,应用程序必须调用该方法。确保如果该方法更改了字段的值,则会显示这些更改

    我的代码在这里:

         import java.awt.FlowLayout;
         import java.awt.event.ActionEvent;
         import java.awt.event.ActionListener;
         import java.lang.reflect.Constructor;
         import java.lang.reflect.Field;
         import java.lang.reflect.InvocationTargetException;
         import java.lang.reflect.Method;
         import java.lang.StringBuffer;
         import java.util.Scanner;
         import javax.swing.JButton;
         import javax.swing.JFrame;
         import javax.swing.JLabel;
         import javax.swing.JPanel;
         import javax.swing.JTextField;
    
         public class ReflectionTest {
    
    private String class_name = "java.lang.StringBuffer";
    
    public ReflectionTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
        JLabel jl1 = null, jl2, jl3, jl4;
        JFrame jf = new JFrame("New");
        JPanel jp = new JPanel();
         JTextField jtf = new JTextField(20);
         JButton jb = new JButton("Press");
         jtf.setVisible(true);
         jp.add(jb);
         jp.add(jtf);
    
         jf.add(jp);
         jf.setVisible(true);
         jf.setSize(400, 550);
         jf.setResizable(false);
    
    
         String text = jtf.getText().toString();
    
         Class cs = Class.forName(text);
    
         jb.addActionListener(
                    new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                             // THIS CODE IS EXECUTED WHEN RETURN IS TYPED
                        }
                    }
                );
    
        for(Constructor c: cs.getConstructors()){
            for(Class p: c.getParameterTypes())
                System.out.print(p.getName()+" ");
            System.out.println();
        }
    
        Constructor c = cs.getConstructor(new Class[]{String.class});
        Object list = c.newInstance("AA");
    
    
        Field pub_fields[] = cs.getFields();
        Field all_fields[] = cs.getDeclaredFields();
        System.out.println("Public fields:");
        for(Field f:pub_fields){
    
            //Showing public fields
            System.out.println();
            jl1 = new JLabel(f.getType().getName() + " " + f.getName());
            jp.add(jl1);
            jl1.setVisible(true);
                    }
        System.out.println("All declared fields:");
        for(Field f:all_fields){
    
            //Showing all declared fields
    
            jl2 = new JLabel(f.getType().getName() + " "+f.getName()+" ");
            jp.add(jl2);
            jl2.setVisible(true);
    
            f.setAccessible(true);
            Object val = f.get(list);
            if (val != null){
                //System.out.println(val.toString());
                jl3 = new JLabel(val.toString());
                jp.add(jl3);
                jl3.setVisible(true);
                System.out.println();
                }
            else{
                System.out.println("NULL");
            //f.get(list1);
        }
        }
    
    }
    
    /**
     * @param args
     * @throws ClassNotFoundException 
     */
    public static void main(String[] args) {
        try{
        // TODO Auto-generated method stub
            new ReflectionTest();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
      }
    
    我有个错误。Eclipse在这行中显示它:
    Class cs=Class.forName(文本)

    这真的是一个错误还是一条“黄”线
    Class
    是一种参数化类型,如果不使用泛型,eclipse将显示警告

    要消除此类警告,只需执行以下操作

    Class<?> cs = Class.forName(text);
    
    Class cs=Class.forName(文本);
    

    通配符是可以的,因为您确实不知道要加载的类的“类型”。

    它真的是一个错误还是一条“黄”线
    Class
    是一种参数化类型,如果不使用泛型,eclipse将显示警告

    要消除此类警告,只需执行以下操作

    Class<?> cs = Class.forName(text);
    
    Class cs=Class.forName(文本);
    

    通配符是可以的,因为您确实不知道要加载的类的“类型”。

    如果您在异常发生之前测试文本字符串,例如打印出来:

      System.out.printf("text = \"%s\"%n", text);
      Class cs = Class.forName(text);
    
    返回:

    text = ""
    java.lang.ClassNotFoundException: 
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at pkg.ReflectionTest.<init>(ReflectionTest.java:42)
        at pkg.ReflectionTest.main(ReflectionTest.java:102)
    
    我支持你的评论,你应该显示关于异常的所有信息。请不要让我们猜问题出在哪里

    编辑

    此外,在匿名内部侦听器类中使用局部变量(包括JLabels和JTextField)也会有问题。解决这个问题的最简单也是最好的方法是将需要在这个监听器中访问的变量设置为私有类字段。因此,从构造函数中删除它们的声明,而将它们移动到类本身。

    如果在异常发生之前测试文本字符串,例如通过打印出来:

      System.out.printf("text = \"%s\"%n", text);
      Class cs = Class.forName(text);
    
    返回:

    text = ""
    java.lang.ClassNotFoundException: 
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at pkg.ReflectionTest.<init>(ReflectionTest.java:42)
        at pkg.ReflectionTest.main(ReflectionTest.java:102)
    
    我支持你的评论,你应该显示关于异常的所有信息。请不要让我们猜问题出在哪里

    编辑

    此外,在匿名内部侦听器类中使用局部变量(包括JLabels和JTextField)也会有问题。解决这个问题的最简单也是最好的方法是将需要在这个监听器中访问的变量设置为私有类字段。因此,从构造函数中删除它们的声明,而将它们移动到类本身。

    eclipse显示了什么错误?标记编辑:标记作为问题删除与Java Enterprise Edition无关。添加了标记,因为它与Swing有关。请参见编辑来回答。eclipse显示了什么错误?标记编辑:标记被删除,因为问题与Java Enterprise Edition无关。添加了标记,因为它与Swing有关。请参见编辑以回答。(upvoter-我完全更改了我回答的内容,第一个内容完全错误。仅供参考)我忽略了构造函数引发异常,因此丢失的异常处理不可能是问题所在。(upvoter-我完全改变了答案的内容,第一个答案完全错了。仅供参考)我忽略了构造函数抛出异常,因此丢失的异常处理不可能是问题所在。+1对于编辑,这是DocumentListener的工作,而不是用脆弱的和黑客的反射进行拍摄,@mKorbel:我认为他可能需要反射,因为这似乎是任务的关键——在GUI中显示组件任何类的对象的元素,并允许通过GUI对其进行修改。+1对于编辑,这是DocumentListener的工作,而不是用脆弱的和粗糙的反射进行拍摄,@mKorbel:我认为他可能需要反射,因为这似乎是任务的关键——在GUI中显示任何类的对象的组件,一个d以允许通过GUI对其进行修改。