{"record":{"id":"3b8cb42df83141a2","repo":"java-native-access/jna","slug":"exception-reading-field-field-getname-in-getclass","errorCode":null,"errorMessage":"Exception reading field '\" + field.getName() + \"' in \" + getClass()","messagePattern":"Exception reading field '\" \\+ field\\.getName\\(\\) \\+ \"' in \" \\+ getClass\\(\\)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/com/sun/jna/Structure.java","lineNumber":657,"sourceCode":"    public Object readField(String name) {\n        ensureAllocated();\n        StructField f = fields().get(name);\n        if (f == null)\n            throw new IllegalArgumentException(\"No such field: \" + name);\n        return readField(f);\n    }\n\n    /** Obtain the value currently in the Java field.  Does not read from\n     * native memory.\n     * @param field field to look up\n     * @return current field value (Java-side only)\n     */\n    Object getFieldValue(Field field) {\n        try {\n            return field.get(this);\n        }\n        catch (Exception e) {\n            throw new Error(\"Exception reading field '\" + field.getName() + \"' in \" + getClass(), e);\n        }\n    }\n\n    /**\n     * @param field field to set\n     * @param value value to set\n     */\n    void setFieldValue(Field field, Object value) {\n        setFieldValue(field, value, false);\n    }\n\n    private void setFieldValue(Field field, Object value, boolean overrideFinal) {\n\n        try {\n            field.set(this, value);\n        }\n        catch(IllegalAccessException e) {\n            int modifiers = field.getModifiers();","sourceCodeStart":639,"sourceCodeEnd":675,"githubUrl":"https://github.com/java-native-access/jna/blob/d036ad9781adad4b66693e8fa7098e4ac665e0a3/src/com/sun/jna/Structure.java#L639-L675","documentation":"Structure.getFieldValue(Field) invokes Field.get(this) reflectively; any failure (e.g. IllegalAccessException on inaccessible fields in restrictive environments) is rethrown as a java.lang.Error wrapping the original exception. It signals the VM refused reflective access to a declared structure field.","triggerScenarios":"Reflective read of a private/package-private field without setAccessible(true) succeeding, e.g. under a SecurityManager or restrictive classloader; field removed/changed by bytecode transformation; on some J2ME/Android-like VMs where access override is unsupported.","commonSituations":"Running under OSGi or app-server classloaders with strict access rules; obfuscated/ProGuard-shrunk builds renaming fields; embedding JNA in a restricted JVM (J2ME, some WebStart setups).","solutions":["Ensure the field is accessible: make it public in the Structure subclass or rely on JNA's own setAccessible call succeeding","Check for a SecurityManager or custom policy blocking reflect access and grant ReflectPermission(\"suppressAccessChecks\") if acceptable","Disable aggressive obfuscation (keep Structure subclass field names in ProGuard/R8 rules)","If the wrapped cause is the real problem, fix according to the cause (e.g. IllegalAccessException) rather than catching the Error"],"exampleFix":"// proguard-rules.pro\n-keepclassmembers class * extends com.sun.jna.Structure {\n    <fields>;\n}","handlingStrategy":"try-catch","validationCode":"try { field.setAccessible(true); } catch (SecurityException e) { /* reflective access unavailable: fail fast */ }","typeGuard":null,"tryCatchPattern":"try { return struct.readField(field); } catch (Error e) { Throwable cause = e.getCause(); log.severe(\"reflective read failed: \" + cause); throw new RuntimeException(cause); }","preventionTips":["Declare Structure fields public","Avoid SecurityManagers and restrictive policies around JNA usage","Keep field names in ProGuard/R8 keep rules","Test structures under the target runtime/classloader"],"tags":["reflection","jna","security","illegal-access"],"backgroundTag":"internal-invariant-violation","analyzedSha":"d036ad9781adad4b66693e8fa7098e4ac665e0a3","analyzedAt":"2026-09-12T06:50:59.239Z","contentChangedAt":"2026-09-12T06:50:59.239Z","schemaVersion":2},"datasetVersion":"2026-09-19T12:17:13.211Z"}