Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反射:通过反射加载的类中的常量变量_Java_Reflection - Fatal编程技术网

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

Java 反射:通过反射加载的类中的常量变量,java,reflection,Java,Reflection,我有一个类,它有一堆常量字符串 我需要通过反射加载这个类并检索这些常量。 我可以达到: controllerClass = Class.forName(constantsClassName); Object someclass = controllerClass.newInstance(); 但是我对如何检索这个类中的字段感到困惑 通过类而不是对象引用了解修饰符 访问字段的快速示例-- 假设这些常量位于静态字段中: import java.lang.reflect.*; public cla

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

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

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

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

通过类而不是对象引用了解修饰符


访问字段的快速示例--


假设这些常量位于静态字段中:

import java.lang.reflect.*;

public class Reflect {
  public static final String CONSTANT_1 = "1";
  public static final String CONSTANT_2 = "2";
  public static final String CONSTANT_3 = "3";

  public static void main(String[] args) throws Exception {
    Class clazz = Class.forName("Reflect");
    Field[] fields = clazz.getDeclaredFields();
    for(Field f: fields) {
      // for fields that are not visible (e.g. private)
      f.setAccessible(true);

      // note: get(null) for static field
      System.err.printf("%s: %s\n",f, (String)f.get(null) );
    }
  }
}
输出为:

$ java Reflect
public static final java.lang.String Reflect.CONSTANT_1: 1
public static final java.lang.String Reflect.CONSTANT_2: 2
public static final java.lang.String Reflect.CONSTANT_3: 3

请注意,对于静态字段的值,您提供了
null
作为参数。

以下是一个小示例:

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
    类中使用了一个exception-catch-all-您应该在代码中使用显式的exception类

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


两个快速问题可能重复:1。这些常数是私人的吗?2.这些常量是静态的吗?需要注意的一个问题是:几个类(例如Boolean)至少有一个静态的最终Boolean成员。即递归定义。如果你想创建一个递归的“类打印机”,一定要检查它!field.equals(父项)
1
2
3
4