Is it possible to invoke a private static method with MethodUtils
?
JavaScript
x
LocalDateTime d = (LocalDateTime)MethodUtils.invokeStaticMethod(Service.class,
"getNightStart",
LocalTime.of(0, 0),
LocalTime.of(8,0));
This code throws the exception:
JavaScript
java.lang.NoSuchMethodException: No such accessible method: getNightStart()
If I change method’s access modifier to public
it works.
Advertisement
Answer
No, because MethodUtils.invokeStaticMethod()
calls Class.getMethod()
under the hood. Even if you try to hack the modifier it won’t be visible to the MethodUtils
as it won’t see the modified Method
reference:
JavaScript
Service.class
.getDeclaredMethod("getNightStart", LocalTime.class, LocalTime.class)
.setAccessible(true);
MethodUtils.invokeStaticMethod(Service.class,
"getNightStart", LocalTime.of(0, 0), LocalTime.of(8, 0));
will still fail with NoSuchMethodException
just like plain reflection:
JavaScript
Service.class
.getDeclaredMethod("getNightStart", LocalTime.class, LocalTime.class)
.setAccessible(true);
Method m = Service.class.getMethod("getNightStart", LocalTime.class, LocalTime.class);
m.invoke(null, LocalTime.of(0, 0), LocalTime.of(8, 0));
This will only work when the Method
object is reused:
JavaScript
Method m = Service.class.getDeclaredMethod("getNightStart", LocalTime.class, LocalTime.class);
m.setAccessible(true);
m.invoke(null, LocalTime.of(0, 0), LocalTime.of(8, 0));