2013-12-11 3 views
0

내 클래스의 모든 개인 데이터 멤버의 이름을 문자열 (배열 또는 목록에있을 수 있음)로 반환하는 함수가 필요합니다. 각 문자열은 내 수업에서 개인이 아닌 최종 데이터 회원의 이름. 비 최종 조건은 선택 사항이지만 좋을 것입니다.클래스의 모든 개인 데이터 멤버의 이름을 얻는 방법

1) 이것도 가능합니까? 클래스의 모든 메서드 이름을 검색 할 수있는 방법이 있다고 생각합니다. 따라서 이것이 가능하다고 생각합니다.

2) 손을 물어 보는 것을 알고 있지만 어떻게해야합니까?

편집

나는 어디서부터 시작 해야하는지 전혀 몰라.

처음에는 java.lang.reflect이 좋은 장소 인 것으로 보입니다. 나는 거기에서 연구하기 시작했다.

+5

'java.lang.reflect' 패키지 당신은'사용해야 – afk5min

답변

2

트릭을 수행해야합니다. 기본적으로 클래스의 모든 필드를 List에 넣었고 비공개가 아닌 필드는 제거합니다. :

public static void main(String [] args){ 
    List<Field> list = new ArrayList<>(Arrays.asList(A.class.getDeclaredFields())); 

    for(Iterator<Field> i = list.iterator(); i.hasNext();){ 
     Field f = i.next(); 
     if(f.getModifiers() != Modifier.PRIVATE) 
      i.remove(); 
    } 
    for(Field f : list) 
     System.out.println(f.getName()); 
} 

출력 :

fieldOne 
fieldTwo 

클래스 A :

class A { 
    private String fieldOne; 
    private String fieldTwo; 

    private final String fieldFinal = null; 

    public char c; 
    public static int staticField; 
    protected Long protectedField; 
    public String field; 
} 
+0

'-에 ((f.getModifiers() Modifier.PRIVATE) = Modifier.PRIVATE를!) 비공개뿐 아니라 필드가 final, static 등일 수도 있습니다. –

+0

@BrianS fieldFinal이 결과 목록에 나타나지 않는다는 것을 어떻게 설명합니까? 귀하의 코드로, 나는 결과리스트에서 fieldFinal을 얻습니다. – user2336315

+0

죄송합니다, 내 의견은'gotModifiers()'및 코드를 실행하지 않는'Modifier' 클래스에 대한 문서를 기반으로 작성되었습니다. 'getModifiers()'는 "필드의 자바 언어 수정자를 반환합니다 ... 수정 자 클래스를 사용하여 수식어를 해독해야합니다." 'Modifier' 클래스는 "수정 자 세트는 다른 수식어를 나타내는 고유 한 비트 위치를 갖는 정수로 표현됩니다." (즉, 비트 필드.) 나는 그것을 조사 할 것이다. –

1
Object someObject = getItSomehow(); 
for (Field field : someObject.getClass().getDeclaredFields()) { 
    field.setAccessible(true); // You might want to set modifier to public first. 
    Object value = field.get(someObject); 
    if (value != null) { 
    System.out.println(field.getName() + "=" + value); 
    } 
} 
0

당신은 Class.getDeclaredMethods 모든 public 메소드에 액세스 할 수 있습니다()하지만 개인 방법을 액세스하기 위해 개인적인 방법의 이름을 알아야합니다.

개인 방법에 액세스하려면 :

Method privateMethod = MyObj.class. 
    getDeclaredMethod("myPrivateMethod", null); //return private method named "myPrivateMethod" 

privateMethod.setAccessible(true); //turn off access check for reflection only 

Object o = privateMethod.invoke(MyObj, null); //call private method 
+0

개인 ** 메소드 **를 호출하려고하지 않습니다. 질문을 더 자세히 읽으십시오. – Josh

+0

새 클래스를 작성하는 경우 클래스 멤버 변수로 목록의 개인 메서드 이름을 정의 할 수 있습니다. 그러나 개인적인 방법 목록을 얻을 수있는 방법은 없습니다. –