1

사용자가 빈을 선택하고 필드를 편집 한 다음 생성 된 빈의 인스턴스를 큐에 추가 할 수있는 Java를 사용하여 GUI를 만들고 싶습니다. 내 질문에 대한 필드에 액세스하는 것입니다. MyParentObject에서 상속받은 MyCompositeObject 클래스가 있습니다. MyParentObject는 여러 개의 빈으로 구성되며, 각각은 더 많은 빈으로 구성됩니다. MyCompositeObject 클래스도 bean으로 구성됩니다. MyCompositeObject에서 접근 가능한 모든 필드를 찾고 싶습니다.자바 빈에 포함 된 모든 멤버 변수의 필드를 찾는 방법

Class MyParentObject 
{ 
    MyObjectOne fieldOne; 
    MyObjectTwo fieldTwo; 
    String name; 
    ... 
} 

Class MyCompositeObject extends MyParentObject 
{ 
    MyObjectThree fieldThree; 
    Integer number; 
    ... 
} 

Class MyObjectThree 
{ 
    boolean aBoolean; 
    MyObjectFour fieldFour; 
    ... 
} 

나는 BeanUtils API를 사용하려고했지만 모든 구성원 빈의 필드를 가져 오려고 노력 중이다. 내가 상상하는 것은 MyCompositeObject의 인스턴스에서 액세스 할 수있는 모든 필드의 깊이 우선 검색입니다. 예를 들어이 필드는 MyCompositeObject.fieldOne, MyCompositeObject.number, MyCompositeObject.fieldThree.aBoolean 필드를 포함하지만 이에 국한되지는 않습니다. 내가 시도 할 때

나는 깨달았다 : 내 머리에이었다

Fields[] allFields = BeanUtils.getFields(myCompositeObject); 

. 나의 연구는 지금까지 내가 기술 한 것을 할 수있는 사전 구축 된 방법을 보여주지 못했다. 이 작업을 수행 할 수있는 API 메소드를 알려 주시거나 내 시스템을 구축하는 방법에 대해 알려주십시오. 감사.

답변

2

그것은 고통의 종류입니다하지만 당신은 두 가지 차원

yourBeanClass.getSuperclass(); (and recursively get all superclasses until Object) 

하고 각 필드를 일단 다음 각각

eachClass.getDeclaredFields() NOT getFields so you can get all the private fields 

의 필드를 얻을 수에 갈 필요가

field.getType() which returns the Class of that field 

물론, 당신은 그 숙녀 수퍼 클래스 체인을 다시 올라가서 클래스를 포함하는 상위 클래스

일단 해당 필드에 대한 클래스 체인이 있으면 위에서 반복하여 필드를 가져올 수 있습니다. 예, jdk가 재미있어졌습니다 !!!! 나는 그들이 getAllDeclaredFields 메소드를 가지고 있었으면 좋겠다. 그래서 나는 슈퍼 클래스 계층을 올라갈 필요가 없었다.

중요 : field.setAccessible (true)을 호출하여 개인 필드 일 때 읽고 쓸 수 있어야합니다. 여기

는 딘

+0

감사에게,

private static List<Field> findAllFields(Class<?> metaClass) { List<Field[]> fields = new ArrayList<Field[]>(); findFields(metaClass, fields); List<Field> allFields = new ArrayList<Field>(); for(Field[] f : fields) { List<Field> asList = Arrays.asList(f); allFields.addAll(asList); } return allFields; } private static void findFields(Class metaClass2, List<Field[]> fields) { Class next = metaClass2; while(true) { Field[] f = next.getDeclaredFields(); fields.add(f); next = next.getSuperclass(); if(next.equals(Object.class)) return; } } 

나중에 .. 슈퍼 클래스를 포함한 클래스의 모든 분야를 얻을 코드입니다. 이것은 나를 가장 많이 얻는다. 필드의 모든 필드를 가져 오는 재귀에 대해 생각할 필요가 있습니다. –