I tried to use java reflection to set a non-static field value of class, but got the “java.lang.IllegalArgumentException”
if I add the “static” modifier for this field. All codes will pass without any exception.
Here is my codes:
Reflections reflections = new Reflections("abc.test", new SubTypesScanner(false));
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
for (Class clazz : classes) {
try {
Optional<Field> optional = Arrays.stream(clazz.getDeclaredFields())
.filter(f -> VariableResolver.class.isAssignableFrom(f.getType()))
.findFirst();
if (!optional.isPresent()) {
continue;
}
Field field = optional.get();
field.setAccessible(true);
field.set(clazz, new DefaultVariableResolver());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Here is the class file and the field.
public class TestClass {
VariableResolver resolver; //The code can only pass if I add 'static' modifier for this field.
public void method(){
String a = resolver.get("test");
}
}
The exception is:
Caused by: java.lang.IllegalArgumentException: Can not set test.util.VariableResolver field test.TestClass.resolver to java.lang.Class
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
at java.base/java.lang.reflect.Field.set(Field.java:799)