首页 > 解决方案 > 使用变量调用 Java 对象常量

问题描述

我对 Java 很陌生,所以我很难解释我想要做什么。

我有一个抽象类,它调用几个对象常量,如下所示:

public abstract class Enchantment implements Keyed {
    /**
     * Provides protection against environmental damage
     */
    public static final Enchantment PROTECTION_ENVIRONMENTAL = new EnchantmentWrapper("protection");

在另一个文件中,我可以很好地访问它
Enchantment value = Enchantment.PROTECTION_ENVIRONMENTAL;

但是,我正在尝试为此使用字符串变量。像这样的东西:

String str = "PROTECTION_ENVIRONMENTAL";
Enchantment value = Enchantment.str;

显然那是行不通的。所以我做了很多研究并了解到我需要为此使用反射。使用这个源代码的文档我想我正在寻找字段数据。所以我尝试了两个:

Field fld = Enchantment.class.getField("PROTECTION_ENVIRONMENTAL");
Field fld = Enchantment.class.getDeclaredField("PROTECTION_ENVIRONMENTAL");

但是这些给我返回了 NoSuchFieldException。正如我所做的那样,我已经尝试了这两种方法getMethod(),而且getDeclaredMethod()同样没有运气。

我现在的观点是这些可能是“对象常量”?我不知道怎么称呼他们。但是我现在绝对不知道如何让它工作,在我自己尝试了一切之后,我想是时候在这里寻求帮助了。

标签: javareflectioninvoke

解决方案


如果您知道枚举将是常量值,则可能需要研究枚举;

public enum Enchantment {
    PROTECTION_ENVIRONMENTAL {
        public void cast() {
            // do enum-specific stuff here
        }
    },
    ANOTHER_ENCHANTMENT {
        public void cast() {
            // do enum-specific stuff here
        }
    },
    A_THIRD_ENCHANTMENT{
        public void cast() {
            // do enum-specific stuff here
        }
    };

    public abstract void cast();
}

枚举可以被视为类并具有方法和属性。您也可以在字符串之间进行转换,Enchantment.valueOf("PROTECTION_ENVIRONMENTAL")但通常是从配置文件中读取 - 在代码中您将直接引用该值。


推荐阅读