2016-11-21 4 views
0

文字列を使用して別のクラスの変数の値を取得する方法を見つける必要があります。文字列を使用して静的変数を見つける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()); 

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

実装のためにシングルトンパターンをダブルチェックします。あまりにも多くのように聞こえる場合は、利用可能な他のオプションがあるかもしれませんが、多くのコンテキストを提供していないか、またはあなたのアプリケーションの目的が何であるか、それは依存します。

関連する問題