2013-06-20 2 views
0

Это, наверное, очень глупый способ, но мы говорим, что у нас был класс с большим количеством полей, которые были компонентами, как можно было бы добавить их в каждый цикл с отражением?Добавление компонентов через отражение в качелях?

Вот что я пытался до сих пор (хотя это, очевидно, обречена на провал):

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(); 
      } 
     } 

Каждый из полей не класс поступая таким образом, выше не будет работать, но я определили, что они собой представляют, и они должны существовать во время выполнения.

Как я должен это делать?

+0

Не делайте этого Reflection возвращает только объявленные поля, но может быть возможно изменить значение или свойства – mKorbel

+0

@mKorbel сказать? – Pureferret

+0

каждый из полей может представлять скомпилированный объект, вы можете [просто изменить любые свойства их значения во время выполнения] (http://stackoverflow.com/questions/6629995/test-if-a-class-contains-an-instance -variable-based-on-its-name), его правильный способ для тестирования целевого или намеренного взлома в скомпилированном коде – mKorbel

ответ

1

Вы пытаетесь создать класс из имени поля, чтобы он не работал.

bits.getName() возвращает что-то вроде «myHelloWorldLabel», а не javax.swing.JLabel.

Вы можете либо добавить значение поля bits.get(this), либо создать новый объект из класса bits.getDeclaringClass().newInstance().

Я также добавил бы, что класс расширяет JComponent.