alibaba/canal · error · IllegalArgumentException

Cannot get field: '{}' @ {}

Error message

Cannot get field: '{}' @ {}

What it means

Thrown by getDeclaredField() when Field.get raises IllegalAccessException despite the helper calling setAccessible(true). This points to a hard access denial: a JPMS module that is not open to dbsync, or a SecurityManager refusing the suppress-accesschecks permission.

Source

Thrown at dbsync/src/main/java/com/taobao/tddl/dbsync/binlog/DirectLogFetcher.java:140

        } catch (NoSuchMethodException e) {
            throw new IllegalArgumentException("No such method: \'" + name + "\' @ " + objClazz.getName(), e);
        } catch (IllegalAccessException e) {
            throw new IllegalArgumentException("Cannot invoke method: \'" + name + "\' @ " + objClazz.getName(), e);
        } catch (InvocationTargetException e) {
            throw new IllegalArgumentException("Invoke method failed: \'" + name + "\' @ " + objClazz.getName(),
                e.getTargetException());
        }
    }

    private static final Object getDeclaredField(Object obj, Class<?> objClazz, String name) {
        try {
            Field field = objClazz.getDeclaredField(name);
            field.setAccessible(true);
            return field.get(obj);
        } catch (NoSuchFieldException e) {
            throw new IllegalArgumentException("No such field: \'" + name + "\' @ " + objClazz.getName(), e);
        } catch (IllegalAccessException e) {
            throw new IllegalArgumentException("Cannot get field: \'" + name + "\' @ " + objClazz.getName(), e);
        }
    }

    /**
     * Connect MySQL master to fetch binlog.
     */
    public void open(Connection conn, String fileName, final int serverId) throws IOException {
        open(conn, fileName, BIN_LOG_HEADER_SIZE, serverId, false);
    }

    /**
     * Connect MySQL master to fetch binlog.
     */
    public void open(Connection conn, String fileName, final int serverId, boolean nonBlocking) throws IOException {
        open(conn, fileName, BIN_LOG_HEADER_SIZE, serverId, nonBlocking);
    }

    /**

View on GitHub (pinned to 87be50e876)

Solutions

  1. Add --add-opens flags opening the mysql driver's package to the application (e.g. --add-opens module/package=ALL-UNNAMED).
  2. Relax or remove the SecurityManager / security policy if reflective access to the driver is intended.
  3. Run dbsync on the classpath (unnamed module) rather than as a named module so opens are not required.
  4. Pin a driver + JVM combination known to allow the field access this fork needs.

Example fix

// before - JVM launch with module access denied
java -jar dbsync-app.jar

// after - open the driver package to the unnamed module
java --add-opens java.base/java.lang=ALL-UNNAMED \
     --add-opens com.mysql.cj/com.mysql.cj.jdbc=ALL-UNNAMED \
     -jar dbsync-app.jar
Defensive patterns

Strategy: validation

Validate before calling

// Detect module/SecurityManager blocking before relying on reflection
java.lang.reflect.Field f = connClazz.getDeclaredField("io");
try { f.setAccessible(true); }
catch (SecurityException se) {
    throw new IllegalStateException("JVM denies reflective field access - open the module or drop SecurityManager", se);
}

Try / catch

try { fetcher.open(conn, file, pos, serverId, false); }
catch (IllegalArgumentException e) {
    if (e.getCause() instanceof IllegalAccessException)
        throw new IOException("module/policy blocks driver field access", e);
    throw e;
}

Prevention

When it happens

Trigger: getDeclaredField locates the field and calls setAccessible(true), but the JVM denies reflective read access - a module is closed (not open) to dbsync, or a SecurityManager lacks ReflectPermission("suppressAccessChecks").

Common situations: Running on Java 9+ where the mysql driver module is not opened to the unnamed module dbsync lives in; a custom SecurityManager / security policy in the app server; an agent that blocks accessibility overrides.

Related errors


AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14). Data as JSON: /api/errors/82833d51ac094fc4. Report an issue: GitHub.