getDeclaredField即使字段存在也会返回nosuchfield异常
我正在使用松露& Graal项目在我自己的项目中。我遇到了一个问题,即当我在Java中使用getDeclaredField()
时,即使该字段存在,也会返回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
字段没有按” t存在于您正在使用的Truffle版本中。
V0.6 - 场unsafeFieldOffsetProvider在NodeUtil.java
存在V0.7 - 场unsafeFieldOffsetProvider不存在NodeUtil.java
但是,'unsafeFieldOffsetProvider'已经在NodeUtil.java中声明,正如我在问题中所述。 – lhan
你正在使用哪种松露版本? – SubOptimal
最后,我们想通了(我在同一项目中@lhan),其它是由我们的Eclipse项目配置的依赖关系的错误顺序引起的......我们必须在项目的“Java Build Path”设置中的“Order and Export”选项卡中更改依赖项的顺序。具体而言,我们必须将com.oracle.truffle.api
和com.oracle.truffle.api.dsl
放在JRE系统库之上。
如果该字段确实在您引用的类中声明,则不会发生。 [例子](http://ideone.com/uOOini)很明显,它不应该真的属于这个类;也许源文件和'.class'文件不同步?也许你正在引用一个*不同的''NodeUtil'类? –
是的,就是这一点。我会仔细检查构建路径和项目资源。 – lhan
我不知道这个Truffle&Graal项目非常好。但它是否会为您的节点创建代理对象? – bvdb