2015-10-16 6 views
0

Я использую Truffle & Грааль проекты в моих собственных проектах. Я сталкиваюсь с проблемой, что, когда я использую getDeclaredField() в Java, он возвращает noSuchFieldException, даже поле существует.getDeclaredField возвращает исключение nosuchfield, даже поле существует

Код производства Исключение составляет

Field field = NodeUtil.class.getDeclaredField("unsafeFieldOffsetProvider"); 
field.setAccessible(true); 

И поле unsafeFieldOffsetProvider объявлен в NodeUtil.java

private static final FieldOffsetProvider unsafeFieldOffsetProvider = new FieldOffsetProvider() { 

    @Override 
    public long objectFieldOffset(Field field) { 
     return unsafe.objectFieldOffset(field); 
    } 

    @Override 
    public int getTypeSize(Class<?> clazz) { 
     if (!clazz.isPrimitive()) { 
      return Unsafe.ARRAY_OBJECT_INDEX_SCALE; 
     } else if (clazz == int.class) { 
      return Unsafe.ARRAY_INT_INDEX_SCALE; 
     } else { 
      throw new UnsupportedOperationException("unsupported field type: " + clazz); 
     } 
    } 
}; 

Вот сообщение об ошибке:

Exception in thread "main" java.lang.ExceptionInInitializerError 
at edu.uci.python.runtime.object.FixedObjectLayout.<init>(FixedObjectLayout.java:100) 
at edu.uci.python.runtime.object.FixedObjectLayout.addAttribute(FixedObjectLayout.java:149) 
at edu.uci.python.runtime.object.PythonObject.setAttribute(PythonObject.java:153) 
at edu.uci.python.runtime.standardtype.PythonModule.addDefaultConstants(PythonModule.java:45) 
at edu.uci.python.runtime.standardtype.PythonModule.<init>(PythonModule.java:41) 
at edu.uci.python.builtins.PythonDefaultBuiltinsLookup.createModule(PythonDefaultBuiltinsLookup.java:88) 
at edu.uci.python.builtins.PythonDefaultBuiltinsLookup.populateBuiltins(PythonDefaultBuiltinsLookup.java:54) 
at edu.uci.python.runtime.PythonContext.<init>(PythonContext.java:79) 
at python.truffle.toa.runtime.PythonContextOA.<init>(PythonContextOA.java:13) 
at python.truffle.toa.main.PythonMainOA.testFile(PythonMainOA.java:78) 
at python.truffle.toa.main.PythonMainOA.main(PythonMainOA.java:39) 
Caused by: java.lang.RuntimeException: java.lang.NoSuchFieldException: unsafeFieldOffsetProvider 
at edu.uci.python.runtime.object.ObjectLayoutUtil.unsafeFieldOffsetProvider(ObjectLayoutUtil.java:43) 
at edu.uci.python.runtime.object.ObjectLayoutUtil.<clinit>(ObjectLayoutUtil.java:47) 
... 11 more 
Caused by: java.lang.NoSuchFieldException: unsafeFieldOffsetProvider 
at java.lang.Class.getDeclaredField(Unknown Source) 
at edu.uci.python.runtime.object.ObjectLayoutUtil.unsafeFieldOffsetProvider(ObjectLayoutUtil.java:39) 
... 12 more 
+0

Если поле действительно объявлено в классе, на который вы ссылаетесь, этого не произойдет. [Пример.] (Http://ideone.com/uOOini). Очевидно, что это не должно быть в этом классе; возможно, источник и файл .class не синхронизированы? Возможно, вы ссылаетесь на * другой класс '' NodeUtil'? –

+0

Да, в этом суть. Я дважды проверю путь сборки и ресурс проекта. – lhan

+0

Я не очень хорошо знаю этот проект Трюфеля и Грааля. Но может ли быть, что он создает объекты прокси для ваших узлов? – bvdb

ответ

0

Поле Безразлично» t существуют в используемой вами версии трюфелей.

v0.6 - поле unsafeFieldOffsetProvider существует в NodeUtil.java

v0.7 - поле unsafeFieldOffsetProvider не существует в NodeUtil.java

+0

Но' unsafeFieldOffsetProvider' уже объявлен в NodeUtil.java, как я сказал в вопросе. – lhan

+0

И какую версию трюфеля вы используете? – SubOptimal

0

В конце концов мы выяснили (я на тот же проект, @lhan), что это было вызвано неправильным порядком зависимостей нашей конфигурации проекта Eclipse ... Нам пришлось изменить порядок зависимостей на вкладке «Заказ и экспорт» в настройке «Путь сборки Java» проекта. В частности, нам пришлось поставить com.oracle.truffle.api и com.oracle.truffle.api.dsl над Системной библиотекой JRE.

Смежные вопросы