2013-06-20 2 views
0

이것은 아마도 매우 바보 같은 방법 일 것입니다.하지만 우리는 컴포넌트 인 Fields가 많은 클래스를 가지고 있는데, 리플렉션을 사용하여 각 루프마다이를 추가하는 방법은 무엇입니까? 여기 스윙에서 반사를 통해 구성 요소를 추가 하시겠습니까?

는 (그것이 분명히 실패 할 운명이지만) 내가 지금까지 시도한 것입니다 : 필드의 각 클래스는 그래서 위에서 작동하지 않습니다하고 하지
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

는 필드를 선언하지만, 할 수 있었다 것은 – mKorbel

+0

@mKorbel 말할 않는 값이나 속성을 수정? – Pureferret

+0

각 Fields는 컴파일 된 Object를 나타낼 수 있으므로 [런타임시 해당 값의 모든 속성을 변경하기 만하면됩니다] (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의를 확장하는 검사를 추가합니다. 그 반사 반환하지 않는다

관련 문제