反射中的java.lang.NoSuchFieldException?

时间:2014-05-14 14:35:58

标签: java exception reflection field nosuchfieldexception

长时间的潜伏者,这里的第一次海报。我已经尝试过搜索但无法找到解决问题的方法。

基本上,我正在为游戏mod编写一个插件,以便为闭源mod提供更多功能。由于它已经关闭,而原始开发者是日本人,我认为反思可能是我最好的选择。

我能够获得所需课程中所有字段的数组,但我无法获得任何字段的值。我需要得到" 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();
                    }
                }
            }

2 个答案:

答案 0 :(得分:0)

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

Object value = field.get(objValue);

应该是:

Object value = field.get(baseClass)

答案 1 :(得分:0)

您的代码没有显示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);