我想写一个类,比如 JComponentEx,它将枚举所有子类成员并将其添加到一个对象中。
这样我就可以写了
class MyComponent extends JComponentEx {
private JLabel mylabel = new JLabel();
private JTextField mytext = new JTextField();
}
这将导致自动调用
this.add(mylabel);
this.add(mytext);
我了解它会在 Swing 的情况下引起的一些问题。我的问题是原则上如何实现这个想法。
更新
简而言之,我想用成员定义填充列表。
更新 2
如果我在构造函数中运行加法,我将看不到成员,因为超类构造函数在子类实例初始化之前执行:
public class Try_Reflection_01 {
private final static Logger log = LoggerFactory
.getLogger(Try_Reflection_01.class);
public static interface IAutoAdd {
}
@SuppressWarnings("serial")
public static class JComponentEx extends JComponent {
public JComponentEx() {
updateComponents();
}
protected void updateComponents() {
log.info("In updateComponents()");
for (Field f : getClass().getFields()) {
try {
Object x = f.get(this);
log.info("Checking '{}' = {}", f.getName(), x);
if (x instanceof IAutoAdd) {
log.info("Adding");
add((JComponent)x);
}
else {
log.info("Not adding");
}
} catch (IllegalArgumentException e) {
log.error("Error getting member", e);
} catch (IllegalAccessException e) {
log.error("Error getting member", e);
}
}
}
}
public static class JMyComponent extends JComponentEx implements IAutoAdd {
public JLabel label = new JLabel("my label");
}
public static void main(String[] args) {
JMyComponent component = new JMyComponent();
}
}
输出
[main] INFO test.java.Try_Reflection_01 - In updateComponents()
[main] INFO test.java.Try_Reflection_01 - Checking 'label' = null
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'WHEN_FOCUSED' = 0
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'WHEN_ANCESTOR_OF_FOCUSED_COMPONENT' = 1
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'WHEN_IN_FOCUSED_WINDOW' = 2
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'UNDEFINED_CONDITION' = -1
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'TOOL_TIP_TEXT_KEY' = ToolTipText
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'TOP_ALIGNMENT' = 0.0
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'CENTER_ALIGNMENT' = 0.5
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'BOTTOM_ALIGNMENT' = 1.0
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'LEFT_ALIGNMENT' = 0.0
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'RIGHT_ALIGNMENT' = 1.0
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'WIDTH' = 1
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'HEIGHT' = 2
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'PROPERTIES' = 4
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'SOMEBITS' = 8
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'FRAMEBITS' = 16
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'ALLBITS' = 32
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'ERROR' = 64
[main] INFO test.java.Try_Reflection_01 - Not adding
[main] INFO test.java.Try_Reflection_01 - Checking 'ABORT' = 128
[main] INFO test.java.Try_Reflection_01 - Not adding