首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理所有子类“超类中的成员”构造函数?

如何处理所有子类“超类中的成员”构造函数?
EN

Stack Overflow用户
提问于 2013-10-27 10:26:55
回答 2查看 108关注 0票数 0

我想编写一个类,比如JComponentEx,它将枚举所有子类成员并将其添加到对象中。

这样我就能写

代码语言:javascript
运行
复制
class MyComponent extends JComponentEx {

    private JLabel mylabel = new JLabel();

    private JTextField mytext = new JTextField();

}

这将导致自动调用

代码语言:javascript
运行
复制
this.add(mylabel);
this.add(mytext);

我知道在秋千的情况下会引起一些问题。我的问题是如何在原则上落实这一想法。

更新

简而言之,我想用成员定义填充列表。

更新2

如果在构造函数中运行加法,我将不会看到成员,因为超类构造函数是在子类实例初始化之前执行的:

代码语言:javascript
运行
复制
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();
    }
}

输出

代码语言:javascript
运行
复制
[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
EN

回答 2

Stack Overflow用户

发布于 2013-10-27 10:29:28

将它们存储在列表中而不是单独的字段中。

代码语言:javascript
运行
复制
protected List<JComponent> components = new ArrayList<>();

// initializer
{
 components.add(new JLabel());
 components.add(new JTextField());
}

当你想使用它们时:

代码语言:javascript
运行
复制
for(JComponent comp : components){
 this.add(comp);
}

另一种储存它们的方法:

代码语言:javascript
运行
复制
protected Map<String, JComponent> components = new HashMap<>();

{
 components.put("inputfield", new JTextField());
}

这将允许您使用键作为标识符轻松地修改组件。

如果您真的想使用反射来实现这一点:

代码语言:javascript
运行
复制
public class MyComponent {
    private JLabel mylabel = new JLabel();
    private JTextField mytext = new JTextField();

    private String someString;

    public List<JComponent> getComponents() throws IllegalArgumentException,
            IllegalAccessException {
        Field[] fields = this.getClass().getDeclaredFields();

        List<JComponent> list = new ArrayList<>();
        for (Field field : fields) {
            Object someField = field.get(this);
            if (someField instanceof JComponent) {
                list.add((JComponent) someField);
            }
        }

        return list;
    }
}

public class Test {
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException{
        MyComponent comp = new MyComponent();
        System.out.println(comp.getComponents().size());
    }
}

输出:

2

票数 1
EN

Stack Overflow用户

发布于 2013-10-27 11:19:26

您需要使用反射--类似于:

代码语言:javascript
运行
复制
for(Field f: getClass().getFields()) {
  Object x = f.get(this);
  if(x instanceof JComponent) add(x);
}

请注意,我给出的内容只适用于公共字段;访问私有字段有点困难--它需要安全权限,因此它不能在未签名的applet中工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19617021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档