2011-02-23 4 views
3

런타임에 코드에 인스턴스화 된 객체를 가져올 수 있습니까? 그런문자열로 인스턴스 객체 가져 오기

뭔가를해야만 :

public String xyz = "aaaa_bbb"; 

getObject("xyz").some function of String (e.g.: .split("_")) 

감사

+3

반사가 원하는 것입니다. 그러나 간단한 'HashMap'이 실제로 필요한 것을 할 수있는 가능성도 있습니다. – biziclop

+0

이것은 불가능합니다. –

답변

5

여기 예를

을, 당신은이 같은 이름을 얻을 수 있습니다. 그것은 당신이 호출하려고하는 로컬 방법 변수가 있다면

import java.lang.reflect.Method; 


public class Test { 


    public String stringInstance = "first;second"; 

    public void Foo() { 


     try { 
      Object instance = getClass().getDeclaredField("stringInstance").get(this); 
      Method m = instance.getClass().getMethod("split", String.class); 

      Object returnValue = m.invoke(instance, ";"); 
      if(returnValue instanceof String[]) 
      { 
       for(String s : (String[])returnValue) 
       { 
        System.out.println(s); 
       } 
      } 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String a[]){ 
     new Test().Foo(); 
    } 



} 

, 당신은 아마 호출 스택 Thread.currentThread().getStackTrace()에서 현재 방식에서의 변수에서 얻을 수 있습니다.

+0

안녕하세요, 저는 이미 당신처럼 구현하고 있지만 이것은 제 문제입니다. m.invoke (stringInstance, ";"); stringInstance는 m.invoke ("stringInstance", ";")와 같은 String이어야합니다. – user630447

+0

@ user630477 조금 편집했습니다. 확인 해봐. –

+0

대단히 고마워,이게 내가 찾고 있던거야 – user630447

0

당신은 질문을 바꿔해야 할 수도 있습니다. 그냥 "AAAA"초기 문자열에서 "BBB"문자열을 얻고 싶은 경우에

, 당신은 당신이 요구하는 무엇인지 확인하기 어렵다 StringTokenizer

0

사용할 수 있지만하여 필드 값을 가져올 수 있습니다 이름은 리플렉션을 사용합니다. 이런 식으로 뭔가가 :

Class c = this.getClass(); // or Someclass.class 
    Field f = c.getDeclaredField("xyz"); 
    String value = (String) f.get(this); 
    ... = value.split("_"); 

코멘트가 지적한대로 정말 연관 배열을 구현하려는 경우

그러나, 거기에 (내가 ... 예외 처리를 많이 남겨 두었다) 자바에서 이것을하는 더 좋은 방법; 예 : Map 클래스를 사용합니다.

+0

jPanel에 사용자 지정 구성 요소가 있고이를 다시 그리지 않고 작업하고 싶습니다. 나는 목록이나 맵을 사용할 수 있다고 생각하지만지도의 값을 변경 한 다음 맵에서 정보가 포함 된 GUI를 다시 그려야합니다. – user630447

0

문자열이 객체의 구성원 필드 인 경우 Field 클래스를 살펴볼 수 있습니다.

그러나 내가 끝내야 할 코드는 여기서 예상 한 것보다 훨씬 길다는 것을 알려드립니다. 사실, 당신은 몇 가지 작업을해야 할 것이다 :

  1. 이의 메소드를 호출 (예를 들어 Class#getDeclaredMethod(...)로 사용)의 이름과 매개 변수 목록에서
  2. 가져 오기 방법을 xyz에 관련된 필드 obejct 받기 특정 인스턴스

이러한 각 단계는 일련의 예외가있는 다소 모호한 코드 줄을 보입니다.

대체 방법이 있다면 사용하십시오! 이 클래스 필드가 있다면

-1

jPanel에 사용자 지정 구성 요소가 있고이를 다시 그리지 않고 작업하고 싶습니다. 나는 목록이나 맵을 사용할 수 있다고 생각하지만지도의 값을 변경 한 다음 맵에서 정보가 포함 된 GUI를 다시 그려야합니다.

+0

나 한테는이 대답이 보이지 않아. – TechNyquist