2014-05-14 3 views
-1

긴 시간 lurker, 처음 포스터 여기. 검색을 시도했지만 문제를 해결할 수있는 항목을 찾을 수 없습니다.리플렉션에서 java.so.NoSuchFieldException이 발생 했습니까?

기본적으로 폐쇄 형 소스 모듈에 몇 가지 기능을 추가하려면 게임 모드 용 애드온을 쓰고 있습니다. 닫혀 있고 원래 개발자는 일본어이므로 반성이 최선의 방법 일 가능성이 높습니다.

필요한 모든 클래스의 배열을 가져올 수 있지만 모든 필드의 값을 가져올 수 없습니다. 엔티티가 움직일 때 (그리고 움직이는 경우에만) 물건을 할 수 있도록 "currentThrottle"값을 가져와야합니다.

다음은 현재 코드입니다. 왜 작동하지 않는지 알 수 없습니다. 왜냐하면 내가 볼 수 있듯이 if 문을 사용하여 필드가 존재하는지 확인한 다음 여전히 발견 할 수 없다고 알려주기 때문입니다.

최종 메모; 나는 완전히 자바에서 교육 받았고, 내가 아는 모든 것은 이것과 같은 포럼을 읽고 단지 다이빙을하고 그것을 가지고 노는 것입니다; 그것이 내가 배우는 최선의 방법입니다.

Object value = field.get(objValue); 

하는 것이되어야한다 여기에 어떤 정말 나쁜 관행이 있다면 그래서, 내가 당신이에서 필드를 얻으려면 :

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(); 
        } 
       } 
      } 
+1

'baseClass' 무엇입니까? 그리고 왜'field2'를 사용하지 않습니까? –

+0

반성하는 수업을 게시하십시오. –

답변

0

변수 objValue가 객체 인스턴스로 대체해야 알려 해주세요 :

Object value = field.get(baseClass) 
0

코드에 baseClass가 표시되지 않습니다. 당신이 사용하고 있다고 생각하는 수업과 함께 일하고 있습니까?

왜 그냥 사용하지 (시도/표시하지 캐치) :

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