Java 在swing中通过反射添加组件?
这可能是一种非常愚蠢的方式,但是假设我们有一个类,其中有很多字段是组件,那么如何在带有反射的for-each循环中添加它们呢 以下是我迄今为止所做的尝试(尽管它显然注定要失败): 每个字段都不是一个类,因此执行上述操作将不起作用,但我已经定义了它们是什么,它们应该在运行时存在Java 在swing中通过反射添加组件?,java,swing,reflection,Java,Swing,Reflection,这可能是一种非常愚蠢的方式,但是假设我们有一个类,其中有很多字段是组件,那么如何在带有反射的for-each循环中添加它们呢 以下是我迄今为止所做的尝试(尽管它显然注定要失败): 每个字段都不是一个类,因此执行上述操作将不起作用,但我已经定义了它们是什么,它们应该在运行时存在 我应该怎么做呢?您试图从字段名创建一个类,所以它不起作用 getName()返回类似“myHelloWorldLabel”的内容,而不是javax.swing.JLabel 您可以添加字段bits.get(this)的值,
我应该怎么做呢?您试图从字段名创建一个类,所以它不起作用 getName()返回类似“myHelloWorldLabel”的内容,而不是javax.swing.JLabel 您可以添加字段
bits.get(this)
的值,或者从类bits.getDeclaringClass().newInstance()创建一个新对象
我还想添加一个检查,确保类扩展了JComponent。不要这样做,反射只返回声明的字段,但可以修改字段的值或属性每个字段都可以表示编译对象,您可以这样做,它是在编译代码中测试purposer或蓄意黑客行为的正确方法
for(Field bits: this.getClass().getDeclaredFields()){
try {
this.add((Component)Class.forName(bits.getName()).newInstance());
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}