让动态加载的 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 相关。
你在这里展示的所有东西都是“静态”的。到目前为止,不需要任何类型的反射或其他动态魔法。
我的情况是:
我正在为自定义测试程序编写软件。 如果加载了带有测试的 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 相关。 你在这里展示的所有东西都是“静态”的。到目前为止,不需要任何类型的反射或其他动态魔法。