apache/dubbo · error · IllegalArgumentException
non-public interfaces class from different packages
Error message
non-public interfaces class from different packages
What it means
Thrown by Mixin.mixin when two or more DELEGATE classes (the dcs array) are non-public AND come from different Java packages. Dubbo generates a single mixin class in one package; non-public types from other packages cannot be referenced there, so the JVM would reject the bytecode. The guard fails fast with IllegalArgumentException.
Source
Thrown at dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java:98
public static Mixin mixin(Class<?>[] ics, Class<?>[] dcs, ClassLoader cl) {
assertInterfaceArray(ics);
long id = MIXIN_CLASS_COUNTER.getAndIncrement();
String pkg = null;
ClassGenerator ccp = null, ccm = null;
try {
ccp = ClassGenerator.newInstance(cl);
// impl constructor
StringBuilder code = new StringBuilder();
for (int i = 0; i < dcs.length; i++) {
if (!Modifier.isPublic(dcs[i].getModifiers())) {
String npkg = dcs[i].getPackage().getName();
if (pkg == null) {
pkg = npkg;
} else {
if (!pkg.equals(npkg)) {
throw new IllegalArgumentException("non-public interfaces class from different packages");
}
}
}
ccp.addField("private " + dcs[i].getName() + " d" + i + ";");
code.append('d')
.append(i)
.append(" = (")
.append(dcs[i].getName())
.append(")$1[")
.append(i)
.append("];\n");
if (MixinAware.class.isAssignableFrom(dcs[i])) {
code.append('d').append(i).append(".setMixinInstance(this);\n");
}
}
ccp.addConstructor(Modifier.PUBLIC, new Class<?>[] {Object[].class}, code.toString());View on GitHub (pinned to 3a3043227f)
Solutions
- Make the delegate classes public so the generated mixin can reference them from any package.
- Restrict all non-public delegates to the same single package.
- Wrap the non-public delegates behind a public facade before passing them to Mixin.
Example fix
// before
package a.b;
class DelegateA {} // package-private
package c.d;
class DelegateB {} // package-private
Mixin.mixin(ics, new Class[]{ DelegateA.class, DelegateB.class });
// after
package a.b;
public class DelegateA {} // make public (or keep all delegates in one package) Defensive patterns
Strategy: validation
Validate before calling
for (Class<?> dc : dcs) {
if (!Modifier.isPublic(dc.getModifiers())) {
// ensure all non-public delegates share one package
}
} Prevention
- Prefer public delegate classes when using Mixin.
- If delegates must be package-private, keep them all in the same package.
- Validate delegate visibility before calling Mixin.mixin.
When it happens
Trigger: Mixin.mixin(ics, dcs) where dcs contains package-private delegate classes whose packages differ from each other (or from the first non-public delegate).
Common situations: Passing internal/package-private implementation classes from multiple modules as delegates; mixing delegates from library A (package a.b) and library B (package c.d), both non-public.
Related errors
- non-public delegate class from different packages
- Missing method [{}] implement.
- Class {} is not a interface.
- non-public interfaces from different packages
- interface limit exceeded
AI-assisted analysis of apache/dubbo@3a3043227f (2026-08-14).
Data as JSON: /api/errors/dc9ee7285a6b0838.
Report an issue: GitHub.