Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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_Field - Fatal编程技术网

Java 获取字段的值

Java 获取字段的值,java,reflection,field,Java,Reflection,Field,我想获取字段初始化时使用的值。 例如: 有什么方法可以做到这一点吗?您首先必须在ClassB中创建一个ClassA实例: ClassA=新的ClassA; System.out.printlna.someString; 但是根据代码的当前格式,最好的选择是声明someString static:publicstaticstring someString=Merry Christmas;。然后,您可以从任何包的任何其他类直接访问此字段,因为它是公共的: System.out.printlnCla

我想获取字段初始化时使用的值。 例如:


有什么方法可以做到这一点吗?

您首先必须在ClassB中创建一个ClassA实例:

ClassA=新的ClassA; System.out.printlna.someString;

但是根据代码的当前格式,最好的选择是声明someString static:publicstaticstring someString=Merry Christmas;。然后,您可以从任何包的任何其他类直接访问此字段,因为它是公共的: System.out.printlnClassA.someString;

我认为您没有完全理解非静态字段的含义:它意味着该字段对于ClassA的每个实例对象都有一个特定的值,因此您无法访问字段内容,因为可能有数千个字段,每个字段都有不同的值

有几种选择:

一种可能的解决方案是将字段设置为静态:

或者正如@toubou所说,您可以构造一个对象并访问该特定对象的字段。但是请注意,字段表示对象的状态,因此可以修改。

如果ClassA.string是静态的,则这是可能的。在这种情况下,您可以通过反射获取值,而无需获取ClassA实例,其中定义了someString:

class ClassA {
  public static String someString = "Merry Christmas";
}
...
Object s = ClassA.class.getField("someString").get(null);
如果变量不是静态的,并且您只想获取其初始值,您仍然可以这样做,假设ClassA有一个默认构造函数:

public static void demo(Class<?> cl) throws Exception {
    Object s = cl.getField("someString").get(cl.newInstance());
    System.out.println(s);
}

这只是一个例子。我正在创建一个带有注释的设置系统,因此我的设置中只有字段可用。现在,我将someString所在的类作为类提供给ClassB。如何从该类创建新对象?@MyNameIsHans如果您有Class类型的变量cl,则可以执行cl.getFieldsomeString.getnull.Yes。但是我希望someString保持非静态,这就是为什么我必须创建一个新的cl对象。我需要初始化someString时使用的值OK。我有很多这个类和其他使用ClassB的类的实例。所以总是创建一个新实例会有点低效。有没有办法只为每种类型的类创建一个默认类,并将它们存储在静态映射或类似的东西中,然后使用这些类来获取某些字符串/其他对象的默认值。@MyNameIsHans绝对有办法!你可以做一张地图。请dv'er解释一下这个答案有什么问题吗?
class ClassA {
  public static String someString = "Merry Christmas";
}
...
Object s = ClassA.class.getField("someString").get(null);
public static void demo(Class<?> cl) throws Exception {
    Object s = cl.getField("someString").get(cl.newInstance());
    System.out.println(s);
}