首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改在另一个java文件中定义的最终变量

更改在另一个java文件中定义的最终变量
EN

Stack Overflow用户
提问于 2015-04-08 19:43:41
回答 2查看 559关注 0票数 2

我在编一个模版。

下面是代码:

代码语言:javascript
复制
package net.minecraft.client.gui;

import java.io.IOException;

import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.audio.SoundHandler;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.ResourceLocation;

public class GuiButton extends Gui {
    public static final ResourceLocation buttonTextures = new ResourceLocation("textures/gui/widgets.png");

如您所见,有变量buttonTextures,它的资源位置是“纹理/gui/widgets.png”。我还有第二个,我想要做的是在执行它时用这个第二个buttonTextures文件来修改它。

我只需要将buttonTextures的资源位置更改为我自己的路径,而是通过另一个Java。也许可以通过用第二个脚本重写代码来完成,我真的毫无头绪。

我在做什么:‘a PAYDAY 2 Mod为我的艺术。当然,我从菜单开始。所以我有两个主菜单。要切换到我的菜单,有一个按钮,你必须按。当你这样做的时候,它会改变它的纹理。但问题是,它不能将按钮纹理更改为/gui/PAYDAY2widgets.png,因为变量是final

如您所见,第一个文件名为GuiButton。我复制了该文件,名为GuiPAYDAY2Button.java,并将路径设置为纹理路径(纹理/gui/PAYDAY2widgets.png)。

现在,如果我将其添加到GuiButton中(我将变量从GuiPAYDAY2Button更改为GuiPAYDAY2Button,但切换到PAYDAY2菜单后游戏就崩溃了),则会使GuiPAYDAY2MainMenu.java文件(GuiMainMenu.java文件的副本)崩溃。我还将GuiButton更改为GuiPAYDAY2Button(在GuiPAYDAY2MainMenu.java文件中),因此它被定向到该文件。我说的是撞车事故,这是坠机报告:

代码语言:javascript
复制
---- Minecraft Crash Report ---- // I feel sad now :(

Time: 8.4.15 21:58 Description: Rendering screen

java.lang.ClassCastException: net.minecraft.client.gui.GuiPAYDAY2Button cannot be cast to net.minecraft.client.gui.GuiButton
    at net.minecraft.client.gui.GuiScreen.drawScreen(GuiScreen.java:99)
    at net.minecraft.client.gui.GuiPAYDAY2MainMenu.drawScreen(GuiPAYDAY2MainMenu.java:453)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1167)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1127)
    at net.minecraft.client.Minecraft.run(Minecraft.java:410)
    at net.minecraft.client.main.Main.main(Main.java:114)
    at Start.main(Start.java:11)

错误、其代码路径和所有已知详细信息的详细演练如下:

代码语言:javascript
复制
-- Head --
Stacktrace:
    at net.minecraft.client.gui.GuiScreen.drawScreen(GuiScreen.java:99)
    at net.minecraft.client.gui.GuiPAYDAY2MainMenu.drawScreen(GuiPAYDAY2MainMenu.java:453)

-- Screen render details --
Details:
    Screen name: net.minecraft.client.gui.GuiPAYDAY2MainMenu
    Mouse location: Scaled: (202, 11). Absolute: (405, 456)
    Screen size: Scaled: (427, 240). Absolute: (854, 480). Scale factor of 2
    Stacktrace:
        at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1167)
        at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1127)
        at net.minecraft.client.Minecraft.run(Minecraft.java:410)
        at net.minecraft.client.main.Main.main(Main.java:114)
        at Start.main(Start.java:11)

-- System Details --
Details:
    Minecraft Version: 1.8
    Operating System: Windows 7 (amd64) version 6.1
    Java Version: 1.8.0_31, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 707532608 bytes (674 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB)
    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    Launched Version: mcp
    LWJGL: 2.9.1
    OpenGL: GeForce GTX 460 v2/PCIe/SSE2 GL version 4.5.0 NVIDIA 347.25, NVIDIA Corporation
    GL Caps: Using GL 1.3 multitexturing. Using GL 1.3 texture combiners. Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported. Shaders are available because OpenGL 2.1 is supported. VBOs are available because OpenGL 1.5 is supported.
    Using VBOs: No
    Is Modded: Very likely; Jar signature invalidated
    Type: Client (map_client.txt)
    Resource Packs: []
    Current Language: English (US)
    Profiler Position: N/A (disabled)

更新

几个小时前,我拍了一段视频,这是对国防部的展示。也许你会明白我想要什么..:https://www.youtube.com/watch?v=ocHT7LdNBYY

好的,我使扩展脚本看起来如下:

代码语言:javascript
复制
package net.minecraft.client.gui; 
import net.minecraft.util.ResourceLocation; 

public class GuiButtonTexureChange extends GuiButton { 
    public static ResourceLocation buttonTextures = new ResourceLocation("textures/gui/PAYDAY2widgets.png");

    // Now this part is needed to be here (otherwise it throws errors):
    public GuiButtonTexureChange(int buttonId, int x, int y, int widthIn, int heightIn, String buttonText) { 
        super(buttonId, x, y, widthIn, heightIn, buttonText); // TODO Auto-generated constructor stub
    } 
}
EN

回答 2

Stack Overflow用户

发布于 2015-04-08 21:16:27

如果您不能修改一些Java代码(例如,它是库的一部分),则仍然可以覆盖任何您喜欢的Java类。

创建另一个源文件夹(这里以Eclipse的形式),并在其中将确切的包和文件作为要编辑的类。在您的情况下,它应该是包net.minecraft.client.gui和文件GuiButton.java.

现在,如果您自己的文件在类路径中居第一位,那么您已经成功地覆盖了一个类。库中的所有其他代码仍然像以前一样工作。

在使用Eclipse时,确保您自己的代码在类路径中处于第一位:项目属性、->、Java构建路径、->顺序和导出

最好将现有代码( GuiButton)复制到您自己的文件中,以便具有相同的起点,然后对代码进行修改。

票数 0
EN

Stack Overflow用户

发布于 2015-04-08 21:10:23

根据安全管理器设置的不同,可以通过反射在运行时更改路径字符串。

例子:

代码语言:javascript
复制
static void setFinalStatic(final Field field, final Object instance, final Object newValue) throws Exception {
      field.setAccessible(true);

      final Field modifiersField = Field.class.getDeclaredField("modifiers");
      modifiersField.setAccessible(true);
      modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL & ~Modifier.PRIVATE);
      field.set(instance, newValue);
}

public final static void main(String[] args) throws Exception {
      String path = "initialPath";
      final char[] after = "sneakyPath".toCharArray();
      setFinalStatic(path.getClass().getDeclaredField("value"), path, after);
      setFinalStatic(path.getClass().getDeclaredField("offset"), path, 0);
      setFinalStatic(path.getClass().getDeclaredField("count"), path, after.length);

      System.out.println(path);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29523975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档