让动态加载的 class 与其加载器 class 通信

Let a dynamically loaded class communicate with its loader class

我的情况是:

我正在为自定义测试程序编写软件。 如果加载了带有测试的 class ,所有必要的值都会通过它的构造函数提供给测试 class 。 测试 class 动态加载在 NetBeans 的所见即所得编辑器中构建的 GUI。 GUI 本身不包含任何比按下按钮或加载菜单时的标签和操作处理程序的 getter 和 setter 更智能的信息。实际测试发生在测试 class 中,因此我可以使用一个标准 UI 进行不同的测试。 应该有从 UI 到测试 class 的反馈,这就是我被困的地方。由于 UI 是 JFrame 的子项,因此 UI 的超级是 javax.swing.JFrame - 而不是动态加载它的测试 class。

我一直在寻找如何让 UI 触发测试 class 中的方法,但我找不到答案。所以可能我正在寻找错误的方法。

请告诉我正确的方向:如果我按下 UI 上的按钮,加载程序 class 中的方法会被触发,我该如何完成?

请记住,我 不能 直接从 class 导入调用该方法,因为 UI 将被各种 classes,取决于我想要 运行 的测试类型,所以 UI 实际上并不直接知道调用它的 class。

[编辑] - 这是我 想要 想要实现的示例代码:

主要class:

package clascomms;


public class ClassComms {
   private final ClassCommsUi ui;
    
    public ClassComms() {
        ui = new ClassCommsUi("Click1","Click2");
}
    
    public void btn1Clicked(){
    // this code should run if button 1 is clicked
    }
     public void btn2Clicked(){
    // this code should run if button 2 is clicked
    }
    

    public static void main(String[] args) {
       ClassComms thisOne = new ClassComms();
    }
    
    
}

和 UI:



package clascomms;

public class ClassCommsUi extends javax.swing.JFrame {
    public ClassCommsUi(String btn1, String btn2) {
        initComponents();
        jButton1.setText(btn1);
        jButton2.setText(btn2);
        this.setVisible(true);
    }

   
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("jButton2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(26, 26, 26)
                .addComponent(jButton1)
                .addGap(27, 27, 27)
                .addComponent(jButton2)
                .addContainerGap(33, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(26, 26, 26)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap(28, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        // If this action happens, method btn1Clicked() in main Class should be called 
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        // If this action happens, method btn2Clicked() in main Class should be called 
    }                                        

    
   

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    // End of variables declaration                   
}

您需要的可能是这样的:

interface TwoButtonsToClick {
    void btn1Clicked();
    void btn2Clicked();
}

...

public class ClassComms 实现 TwoButtonsToClick { 私人最终 ClassCommsUi ui;

   public ClassComms() {
       ui = new ClassCommsUi(this, "Click1","Click2");
   }

   @Override
   void btn1Clicked() { 

...

然后:

public class ClassCommsUi extends javax.swing.JFrame {
    private TwoButtonsToClick mainClass;
    public ClassCommsUi(TwoButtonsToClick mainClass, String btn1, String btn2) {
        this.mainClass = mainClass;
        initComponents();
        jButton1.setText(btn1);
        jButton2.setText(btn2);
        this.setVisible(true);
    }

现在你的 UI class 有一个 class 的实例可以回调。

并注意:您的代码示例中没有任何内容与 动态 加载 classes 相关。 你在这里展示的所有东西都是“静态”的。到目前为止,不需要任何类型的反射或其他动态魔法。