在 Java 中使用反射按名称获取变量

Jep*_*ron 2 java reflection

我有一个 Java 类,其中包含一个名为 fillColor 的 Color 对象,以及其他几种颜色;

反射对此可能有点过分了,事实上我可能最终会使用地图,但无论哪种方式,这都值得一问。

这是该类的一个方法,它返回基于字符串的颜色。

public Color getColor(String name) {
    Field field;
    Color c= new Color();
    try{
        field = getClass().getDeclaredField(name);
        System.out.println(field.get(c));
    }catch(Exception e){
        System.out.println(e.getMessage());
        throw new RuntimeException("wtf happened here?");
    }

    return c;
}
Run Code Online (Sandbox Code Playgroud)

这会引发异常。消息内容如下

Can not set com.badlogic.gdx.graphics.Color field com.whatever.project.Hexagon.fillColor to com.badlogic.gdx.graphics.Color
Run Code Online (Sandbox Code Playgroud)

显然我很困惑。此消息是否告诉我无法将颜色字段分配给颜色变量?

编辑:堆栈跟踪

java.lang.IllegalArgumentException: Can not set com.badlogic.gdx.graphics.Color field com.whatever.project.Hexagon.fillColor to com.badlogic.gdx.graphics.Color
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
    at java.lang.reflect.Field.get(Field.java:379)
    at com.whatever.project.Hexagon.getColor(Hexagon.java:177)
    at com.whatever.project.Animator$1.animate(Animator.java:45)
    at com.whatever.project.Animator.animate(Animator.java:86)
    at com.whatever.project.Project.render(BlackDot.java:40)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
Run Code Online (Sandbox Code Playgroud)

fillColor 声明如下:

Color fillColor;
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 5

你得到一个字段

field = getClass().getDeclaredField(name);
Run Code Online (Sandbox Code Playgroud)

this大概是关于任何类型com.whatever.project.Hexagon。但随后您尝试检索类型为 的对象上的字段com.badlogic.gdx.graphics.Color

System.out.println(field.get(c));
Run Code Online (Sandbox Code Playgroud)

这是错误的。javadoc指出

Field返回指定对象上this 表示的字段的值。

Color没有Color字段。

你想要的可能是

field.get(this)
Run Code Online (Sandbox Code Playgroud)