使用String查找静态变量Java

时间:2016-11-21 15:31:54

标签: java string class variables

我需要找到一种方法来使用String来获取另一个类中变量的值。例如,假设我有这门课程:

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

我在另一个班级中也有这个字符串:

String str = "ClassName.f";

有没有办法可以使用String,str来获取ClassName.f的值?我不想将每个值硬编码到特定方法中。

3 个答案:

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

如果您的静态字段不公开,则需要使其可访问,为此,您需要添加&#34; setAccessible&#34;线...

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

答案 1 :(得分: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

答案 2 :(得分:0)

根据评论中的建议,地图可能是您最好的选择,因为在这种情况下,反映可能不是最佳做法。

为了能够从你的程序中的任何地方调用它,你需要像 Singleton 这样的模式,必须谨慎处理:

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

仔细检查单例模式是否实现。如果它听起来太多了,那么可能还有其他选项,但是你没有提供太多的上下文或你的应用程序的目的是什么,所以它取决于。