有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java反射:通过反射加载的类中的常量变量

我有一个类,它有一堆常量字符串

我需要通过反射加载这个类并检索这些常量。 我可以达到:

controllerClass = Class.forName(constantsClassName);
Object someclass = controllerClass.newInstance();

但是我对如何检索这个类中的字段感到困惑


共 (3) 个答案

  1. # 1 楼答案

    访问字段的快速示例--

    Field[] fields = controllerClass.getDeclaredFields();
    
    for ( Field field : fields ) {
       field.setAccessible(true);
      System.out.println(field.get(someClass));
    
    }
    
  2. # 2 楼答案

    以下是一个小例子:

    import java.lang.reflect.Field;
    
    public class Test {
        public static class X {
            public static int Y = 1;
            private static int Z = 2;
    
            public int x = 3;
            private int y = 4;
        }
    
        public static Object getXField(String name, X object) {
            try {
                Field f = X.class.getDeclaredField(name);
    
                f.setAccessible(true);
    
                return f.get(object);
            } catch (Exception e) {
                e.printStackTrace();
    
                return null;
            }
        }
    
        public static void main(String[] args) {
            System.out.println(Test.getXField("Y", null));
            System.out.println(Test.getXField("Z", null));
    
            System.out.println(Test.getXField("x", new X()));
            System.out.println(Test.getXField("y", new X()));
        }
    }
    

    运行这个小程序输出:

    1
    2
    3
    4
    

    以下是一些观察:

    • 对于静态字段,提供给Field.get()的对象可以是null

    • 为了简洁起见,我在基类Exception中使用了一个异常捕获所有类——您应该在代码中使用显式异常类

    • 虽然Field.get()通常能像预期的那样工作,但对Field.set()及其朋友来说,情况并非如此。更具体地说,它将乐于更改常量的值(例如,在类方法中从未修改过的final字段或private字段),但由于常量内联,旧值可能仍在使用