2016-11-21 3 views
0

String을 사용하여 다른 클래스의 변수 값을 얻는 방법을 찾아야합니다.String을 사용하여 정적 변수 찾기 Java

public class ClassName { 
    public static File f = new File ("C:\\"); 
} 

그리고 나는 또한 다른 클래스에서이 문자열했다 :

String str = "ClassName.f"; 

내가 문자열을 사용할 수있는 방법은 STR, 거기에 값을 얻을 수를 예를 들어, 내가이 클래스를 가지고 말 ClassName.f의? 나는 각 값을 특정한 방법으로 하드 코딩하고 싶지 않다.

+0

당신은 반사를 찾고 있습니다. 그러나 대신 맵을 사용해야합니다. – SLaks

+0

어떻게 사용 하시겠습니까? – user6615347

+0

문자열과 클래스의 맵? –

답변

1

정적 필드 만 필요하다고 가정하면 다음 코드는 문자열 분할을 수행하고 리플렉션을 사용하여이 작업을 수행합니다. 실행할 때이 작업을 수행하기 위해, 당신은 "setAccessible"라인을 추가해야

import java.lang.reflect.Field; 

public class StackOverflow { 

    public static String oy = "OY"; 

    public static void main(String[] args) { 
     System.out.println(getStaticValue("StackOverflow.oy")); 
    } 

    public static Object getStaticValue(String fieldId) { 
     int idx = fieldId.indexOf("."); 
     String className = fieldId.substring(0, idx); 
     String fieldName = fieldId.substring(idx + 1); 

     try { 
      Class<?> clazz = Class.forName(className); 
      Field field = clazz.getDeclaredField(fieldName); 
      return field.get(null); 
     } catch(Exception ex) { 
      // BOOM! 
      ex.printStackTrace(); 
     } 

     return null; 
    } 
} 

정적 필드가 공개하지 않은 경우, 당신이 그것을 액세스 할 수 있도록해야합니다 ... "오우"를 인쇄합니다 ...

import java.lang.reflect.Field; 

public class StackOverflow { 

    private static String oy = "OY"; 

    public static void main(String[] args) { 
     System.out.println(getStaticValue("StackOverflow.oy")); 
    } 

    public static Object getStaticValue(String fieldId) { 
     int idx = fieldId.indexOf("."); 
     String className = fieldId.substring(0, idx); 
     String fieldName = fieldId.substring(idx + 1); 

     try { 
      Class<?> clazz = Class.forName(className); 
      Field field = clazz.getDeclaredField(fieldName); 
      field.setAccessible(true); 
      return field.get(null); 
     } catch(Exception ex) { 
      // BOOM! 
      ex.printStackTrace(); 
     } 

     return null; 
    } 
} 
0

사용 reflection :

// make array to use easier 
String[] str = "ClassName.f".split("\\."); 

// get the class 
Class c = Class.forName("packagename." + str[0]); 
// get the field 
Field field = c.getDeclaredField(str[1]); 

// USE IT! 
System.out.println(field.getName()); 

출력 :

f 
0

의견에 제안 된대로 최선의 방법이 될 수 있습니다.이 경우 반사가 모범 사례가 아니기 때문일 수 있습니다. 어디서든 프로그램에서 호출 할 수 있으려면

, 당신이 취급시주의해야하는 싱글 패턴, 같은 필요한 것 : 그런 다음

public class ClassNameHandler { 
    private static ClassNameHandler instance = null; 
    protected ClassNameHandler() { 
     // Exists only to defeat instantiation. 
    } 

    public Map<String, File> map = new HashMap<String, File>(); 

    public File f = ClassName.f; 
    map.put("ClassName.f", f); 
    //Add more files or variables to the map 

    public static ClassNameHandler getInstance() { 
     if(instance == null) { 
     instance = new ClassNameHandler(); 
     } 
     return instance; 
    } 
} 

을 다른 곳에서, 당신은 사용할 수 있습니다 예 :

String str = "ClassName.f"; 
ClassNameHandler.map.get(str); 

구현을 위해 싱글 톤 패턴을 두 번 확인하십시오. 그것이 너무 많이 들리면 사용 가능한 다른 옵션이있을 수 있지만 많은 컨텍스트를 제공하지 않았거나 응용 프로그램의 용도가 무엇인지에 따라 다릅니다.