2013-05-13 6 views
0

클래스가 아닌 인스턴스에서 Field 참조를 가져 오는 방법이 있습니까? 인스턴스에서 필드 가져 오기?

은 예입니다 : 너무 명확 없었던

public class Element { 
    @MyAnnotation("hello") 
    public String label1; 

    @MyAnnotation("world") 
    public String label2; 
} 

public class App { 
    private Element elem = new Element(); 

    public void printAnnotations() { 
     String elemLabel1 = elem1.label; 
     String elemLabel2 = elem2.label; 

    // cannot do elemLabel.getField().getDeclaredAnnotations(); 
     String elemLabel1AnnotationValue = // how ? 
     String elemLabel2AnnotationValue = // how ? 
    } 
} 

죄송합니다,하지만 난 이미 클래스에서 필드를 가져 오는 방법을 알고 (클래스 -> 필드 -> DeclaredAnnotations)

내가 궁금한 것은 특정 인스턴스에 대해 Field를 가져 오는 방법입니다. 이 예제에서는 elemLabel1 string 인스턴스에서 Element.label1 필드를 가져올 수 있기를 원합니다.

+0

내게는 당신이 당신의 표제와 다른 샘플을 요구하고있는 것처럼 보입니다. 주석이나 필드를 가져 오려고하십니까? –

+0

실제로 특정 필드에 대한 주석을 얻을 수 있기 전에 실제로 필드를 가져오고 있습니다. 따라서 필자의 의견으로는 필드를 얻는 것에 관한 것입니다. – bertie

+0

질문의 표현 방식에 따라 클래스에서 데이터를 가져 오는 방법을 이미 알고 있지만 인스턴스에서 정보를 얻으려는 것처럼 들립니다. 그렇다면'.getClass()'가 도움이 될 것입니다. –

답변

2

정확히 무엇을 의미합니까? A Field on Class에 정의 됨. 당신은 특정 인스턴스에 대한 를 얻을 수 있습니다 : -

private static class Test { 
    private int test = 10; 
} 

public static void main(String[] args) throws Exception { 
    final Test test = new Test(); 
    final Field field = Test.class.getDeclaredField("test"); 
    field.setAccessible(true); 
    final int value = field.getInt(test); 
    System.out.println(value); 
} 

다음은 class Testtest라는 Field 있습니다. 이는 Test에 해당하며 Class에 정의되어 있습니다. class의 인스턴스는 Field에 대한 특정 값을 가지며이 경우 10입니다. 이것은 getXXX 또는 get 메소드를 사용하여 특정 인스턴스에 대해 검색 할 수 있습니다. 당신이 Annotation 필드 class 필드의 값이 아닌 값을 원하는처럼

질문의 코드에서 편집

가 보인다.

Java에서 주석의 값은 컴파일시 상수이므로 인스턴스 수준이 아닌 class으로 정의됩니다. 당신의 예에서

public class Element { 
    @MyAnnotation("l") 
    public String label; 
} 

MyAnnotation 값 필드는 Element모든 예를 들어 1에 같아야합니다.

+0

Test 클래스의 static을 –

+0

으로 만들 때의 요점은'static void main' 메서드에서 참조 할 수 있도록하기 위해서입니다. 예제를보다 간결하게 만들기 위해서. –

+0

안녕하세요. Boris. 예, 클래스 수준 정의입니다. 하지만 내 프로그램에서, 나는 주석 문자열을 포함하는 클래스를 알 수 없습니다. 내가 가진 것은 String 인스턴스 (메서드 매개 변수로 전달되었을 수 있음)뿐입니다. 그리고 난 그 String 인스턴스의 필드를 얻을 수 있는지 궁금 해서요. – bertie

2

Field은 수업에 속합니다. 따라서 당신은 실제로 다음을 수행 할 : 당신의 분야가 public는 일반적으로 모든 필드 private을해야입니다

elemLabel.getClass().getField("theFieldName").getDeclaredAnnotations();

그러나 있지만. 이 경우 getField() 대신 getDeclaredField()을 사용하십시오.

EDIT 필드를 사용하려면 먼저 field.setAccessible(true)으로 전화해야합니다.

+0

필드가 클래스에 속하는 노트 주셔서 감사합니다. 그러나 내 경우에는 문자열이 단지 문자열 일뿐입니다. 프로그램이 해당 문자열을 포함하는 클래스를 알지 못하기 때문입니다. 그래서 내가 문자열 인스턴스에 대한 필드를 얻을 수 있는지 궁금 해서요. – bertie

관련 문제