2016-11-21 76 views
0

我需要找到一種方法來使用一個字符串來獲取變量的值,在另一個類中。例如,假設我有這個類:使用字符串找到一個靜態變量Java

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

而且我也有過這樣的字符串在不同的類:

String str = "ClassName.f"; 

有沒有一種方法,我可以使用String,STR,來獲取值ClassName.f?我不想將每個值硬編碼到一個特定的方法。

+0

您正在尋找反射。但是,您應該使用地圖代替。 – SLaks

+0

你會如何使用它? – user6615347

+0

字符串到類的映射? –

回答

1

假設您始終只需要靜態字段,下面的代碼會執行一些字符串拆分並使用反射來執行此操作。運行時,它會打印「OY」 ......

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; 
    } 
} 

如果你的靜態字段不公開,你需要使它訪問,要做到這一點,你需要添加「setAccessible」行...

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()); 

OUTPUT:

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); 

仔細檢查單例模式的實現。如果聽起來太多了,那麼可能有其他選項可用,但是您沒有提供太多的上下文或應用程序的目的,所以這取決於它。

相關問題