【问题标题】:java.lang.NoSuchFieldException in reflection?java.lang.NoSuchFieldException 在反射?
【发布时间】:2014-05-14 14:35:57
【问题描述】:

潜伏已久,第一次发帖。我已尝试搜索,但找不到任何解决问题的方法。

基本上,我正在为游戏模组编写一个插件,以便为闭源模组添加更多功能。由于它已关闭,并且最初的开发者是日本人,我认为反射可能是我最好的选择。

我能够获得我需要的类中所有字段的数组,但我无法获得任何字段的值。我需要获取“currentThrottle”值,以便在实体移动时(并且仅在它移动时)做一些事情

这是我当前的代码。我不知道为什么它不起作用,因为如您所见,我使用 if 语句来确保该字段确实存在,然后它仍然告诉我找不到它。

最后说明;我在 Java 方面完全是自学的,我所知道的一切都来自阅读这样的论坛,然后潜入并玩弄它;这是我学习的最好方法。所以,如果这里有什么不好的做法,请告诉我:)

Class planeClass = Class.forName("mcheli.plane.MCP_EntityPlane");
Field[] fields = planeClass.getFields();

//Some other irrelevant code

            for (Field field2 : fields) {
                String name = field2.getName();
                if (name.contains("currentThrottle")) { 
                    System.out.println("name: " + name);
                    try {
                        field = baseClass.getClass().getField(name);
                        field.setAccessible(true);

                        Class<?> targetType = field.getType();
                        Object objValue = targetType.newInstance();

                        Object value = field.get(objValue);

                        System.out.println("Throttle: " + value);
                    } catch (NoSuchFieldException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (SecurityException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InstantiationException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

【问题讨论】:

  • 什么是baseClass?你为什么不直接使用field2
  • 请同时发布您正在反思的课程。

标签: java exception reflection field nosuchfieldexception


【解决方案1】:

应将变量 objValue 替换为您要从中获取字段的对象实例:

Object value = field.get(objValue);

应该是:

Object value = field.get(baseClass)

【讨论】:

    【解决方案2】:

    您的代码没有显示 baseClass 是什么。您是否正在使用您认为正在使用的类?

    为什么不直接使用(try/catch 未显示):

    Class planeClass = Class.forName("mcheli.plane.MCP_EntityPlane");
    Object plane = planeClass.newInstance();
    Field throttleField = planeClass.getField("currentThrottle");
    Object thottleValue = throttleField.get(plane);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2013-01-06
      • 1970-01-01
      相关资源
      最近更新 更多