2012-12-03 5 views
2

나는 수업을 :클래스 계층 구조의 모든 필드를 가져

ClassA{ 
public String filedA; 
} 

ClassB extends ClassA{ 
public String filedB; 
} 

ClassC extends ClassB{ 
public String filedC; 
} 

그럼 객체 생성 : 나는 모든 필드를 얻을 시도 후

ClassC c=new ClassC(); 
c.fieldC="TestC"; 
c.fieldA="TestA"; 
c.fieldB="TestB"; 

, 나는

Field[] fields=c.getClass().getDeclaredFields(); 

하지만 전화 하나의 항목으로 배열 가져 오기

fields[fieldC] 

모든 클래스의 모든 필드를 가져 오는 방법에는 extends가 포함되어 있습니까? 모든 슈퍼 클래스 필드를 원하는 경우

Field[] fields = c.getClass().getFields(); 

은 다음을 참조하십시오 :

답변

0

Field[] fields = c.getClass().getFields(); 

액세스 가능한 모든 필드가 반환됩니다.

1

ClassB (아마도 ClassA 등)에서 파생 된 ClassC 인 경우 반영됩니다. 나는 이것이 오식이라고 생각 하나? 다음 :

Field[] fields = c.getClass().getFields(); 

예상대로 작동합니다.

5

C 클래스는 클래스를 확장하지 않습니다. 그런 다음 getDeclaredFields()은 본 것처럼 String filedC 만 반환합니다. 클래스가이 필드를 선언하지 않으므로 c.fieldA="TestA"c.fieldB="TestB"을 사용할 수 없습니다.

이 나타내는 클래스 또는 인터페이스의 모든 액세스 가능한 public 필드를 반영하는 Field 객체 배열을 반환 어쨌든, C 인 경우에만 공개 필드 (상속 포함)을 반환 getFields() 방법 B 연장 B는 확장 Class 객체

그리고 getDeclaredFields() 반환 클래스에 선언 된 모든 필드 (상속 제외) :

이 Class 객체가 나타내는 클래스 또는 인터페이스에 의해 선언 된 모든 필드를 리플 렉트하는 Field 객체의 배열을 돌려줍니다. 여기에는 public, protected, default (package) 액세스 및 private 필드가 포함되지만 상속 된 필드는 제외됩니다.

1

getDeclaredFields() 수퍼 클래스에서 상속 된 flield가 포함되어 있지 않습니다.

당신은 당신이 Apache Commons Lang 버전 3에 의존 할 수있는 바퀴를 재발견하지 않으려면 모든 clields 그냥 getFields() 방법

+0

getFields 포함 돌아가! 그것은 그가 필드 püublic을 가지고 있기 때문에 그것이이 특별한 질문에서 작동한다는 것을 의미합니다. –

1

를 사용합니다.2 + 이는 FieldUtils.getAllFieldsList 제공 : getDeclaredFields를 사용하기 때문에

import java.lang.reflect.Field; 
import java.util.AbstractCollection; 
import java.util.AbstractList; 
import java.util.AbstractSequentialList; 
import java.util.Arrays; 
import java.util.LinkedList; 
import java.util.List; 

import org.apache.commons.lang3.reflect.FieldUtils; 
import org.junit.Assert; 
import org.junit.Test; 

public class FieldUtilsTest { 

    @Test 
    public void testGetAllFieldsList() { 

     // Get all fields in this class and all of its parents 
     final List<Field> allFields = FieldUtils.getAllFieldsList(LinkedList.class); 

     // Get the fields form each individual class in the type's hierarchy 
     final List<Field> allFieldsClass = Arrays.asList(LinkedList.class.getFields()); 
     final List<Field> allFieldsParent = Arrays.asList(AbstractSequentialList.class.getFields()); 
     final List<Field> allFieldsParentsParent = Arrays.asList(AbstractList.class.getFields()); 
     final List<Field> allFieldsParentsParentsParent = Arrays.asList(AbstractCollection.class.getFields()); 

     // Test that `getAllFieldsList` did truly get all of the fields of the the class and all its parents 
     Assert.assertTrue(allFields.containsAll(allFieldsClass)); 
     Assert.assertTrue(allFields.containsAll(allFieldsParent)); 
     Assert.assertTrue(allFields.containsAll(allFieldsParentsParent)); 
     Assert.assertTrue(allFields.containsAll(allFieldsParentsParentsParent)); 
    } 
} 
관련 문제