java - 引用一个在编译时无法解析的变量。 (java)

标签 java class dynamic compiler-errors

我正在创建一个程序,其中可以在运行时使用以下方式创建类引用:

String hero1builder = "index.";
System.out.println("Enter hero 1:");
hero1 = scanner.nextLine();
hero1builder += hero1;
hero1cls = Class.forName(hero1builder);
System.out.println("Hero 1 found");

所有这些代码都在try/catch内,并且可以按预期工作。
当我想引用所引用类中的变量时,我的挑战就来了。

在编译时,java注意到我要在此处引用的变量尚无法解析,因此无法编译。我该如何绕过它,以便可以在类内部引用变量?
String[] hero1list = hero1cls.counterList;

我尝试了许多方法来引用变量counterList,但没有一个起作用。 hero1cls保持动态很重要,否则我的程序将无法运行。

(在此示例中,index是包,所以index.Abaddon.counterList是我要引用的。如果我以这种方式明确地编写它,则该方法非常有效。)(PS 2:这不是范围的问题。counterList是唯一会在此程序中引发错误的东西,并且hero1cls.getField()之类的方法都可以使用。)

这是我正在引用的类的示例:
package index;

public class Abaddon {
    public static String[] counterList = {"Axe",
                   "AncientApparition",
                   "Doom",
                   "Lina",
                   "Lion",
                   "OutworldDevourer",
                   "ShadowDemon",
                   "Slark",
                   "Undying"
    };
}

最佳答案

如果您想摆脱get(null)并处理非静态成员,则可以通过按以下方式调用Adaddon来创建clazz.newInstance()实例:

    String className = "index.Abaddon";
    Class<?> clazz = Class.forName(className);
    Field field = clazz.getDeclaredField("counterList");
    if (field.getType().isArray()) {
        final String[] arr = (String[]) field.get(clazz.newInstance());
        System.out.println(Arrays.toString(arr));
    }

关于java - 引用一个在编译时无法解析的变量。 (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621307/

相关文章:

python - 方法 __getattr__ 不是从父类继承的

javascript - 覆盖 javascript 类中的默认 get,例如 php 中的 __get

c# - 编译器错误 : An expression tree may not contain a dynamic operation

java - Android中带有声音的进度对话框

java - 使用 OAuth2 保护 REST Web 服务 : General principles

c++ - 在类层次结构中初始化变量

c++ - 是否可以在 C++ 中动态填充 char* 数组

java - JPA 没有 EntityManager 的持久性提供者

java - 在 Android 中使用 MediaPlayer 播放 mp3 文件列表

c++ - 在超出范围期间调用类的析构函数