如何从此方法外部访问此变量?

时间:2020-06-04 07:33:32

标签: java java-8 minecraft-forge

我一直在尝试开发Minecraft mod,但是遇到了一个路障,在这个路障中我没有超越的机会。在尝试解决此问题的过程中,我筛选了多个其他问题和网站,但无济于事。

我得到的最接近的是在方法之外创建变量,然后在方法内部设置值的地方。但是,这样做的问题是它总是返回null。

此外,如果不清楚,我正在谈论“ taskEntriesMethod”变量。

这是我的代码:

 public void getExecutingTaskEntries(Profiler profiler)
    {
        try
        {
            Class<?> AITasks = Class.forName("net.minecraft.entity.ai.EntityAITasks");

            Field taskEntries = AITasks.getDeclaredField("executingTaskEntries");
                  taskEntries.setAccessible(true);

            Object AITasksObj = taskEntries.get(new EntityAITasks(profiler));

            Set<EntityAITasks.EntityAITaskEntry> taskEntriesMethod = (Set<EntityAITaskEntry>) AITasksObj;



        }
        catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException exception) { exception.printStackTrace(); }

    }


    private final Set<EntityAITasks.EntityAITaskEntry> executingTaskEntries = taskEntriesMethod; //  <-- (this is what errors out)

2 个答案:

答案 0 :(得分:0)

您需要executingTaskEntries才能成为final吗?

您可以简单地:

public void initExecutingTaskEntries(Profiler profiler) // changed name here, get suggested its going to return something
    {
        try
        {
            Class<?> AITasks = Class.forName("net.minecraft.entity.ai.EntityAITasks");

        Field taskEntries = AITasks.getDeclaredField("executingTaskEntries");
              taskEntries.setAccessible(true);

        Object AITasksObj = taskEntries.get(new EntityAITasks(profiler));

        executingTaskEntries = (Set<EntityAITaskEntry>) AITasksObj;



    }
    catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException exception) { exception.printStackTrace(); }

}


private Set<EntityAITasks.EntityAITaskEntry> executingTaskEntries;

如果您需要将executingTaskEntries设置为final,那么我会将其初始化为空的Set,然后在您的方法中将整个内容添加到其中。

答案 1 :(得分:0)

您已经创建了一个get方法,但已将其声明为void。您可能想将代码更改为以下内容:

public Set<EntityAITasks.EntityAITaskEntry> getExecutingTaskEntries(Profiler profiler) {
    //your code
    return (Set<EntityAITaskEntry>) AITasksObj;
}

然后像这样使用它

Set<EntityAITasks.EntityAITaskEntry> executingTaskEntries = getExecutingTaskEntries(profiler)